2010-02-25 31 views
7

Tôi có ví dụ này đơn giản, tôi không thể dường như để làm việc:Oracle MERGE không INSERT

MERGE INTO mytable mt 
USING dual 
ON (mt.id = 'AAA') 
WHEN MATCHED THEN 
    UPDATE SET mt.name = 'updated' 
WHEN NOT MATCHED THEN 
    INSERT (mt.id , mt.name) 
    VALUES ('AAA', 'Gooood'); 

Nếu một 'AAA' kỷ lục tồn tại trong bảng, nó được cập nhật thành công.

Nhưng nếu không tồn tại, nó không được chèn vào:

Affected rows: 0 
Time: 0.003ms 

Bất kỳ manh mối về những gì tôi đang làm sai?

+0

công cụ mà bạn đang sử dụng mà đáp lại "bị ảnh hưởng hàng: 0 Thời gian: 0.003ms" Cái gì? –

+0

Người ta tự hỏi liệu OP có hợp nhất mà không cam kết trong một phiên và truy vấn từ một phiên khác hay không. Hoặc liệu ứng dụng hiện có có giải thích đúng đầu ra từ tương tự của SQL% ROWCOUNT hay không. –

+0

Có thể bảng 'mytable' của bạn có thể đòi hỏi nhiều hơn chỉ là' id' và 'name' để thực hiện chèn hợp lệ không? –

Trả lời

8

trình cho tôi:

SQL> create table mytable (id varchar(3), name varchar(30)); 

Table created. 

SQL> MERGE INTO mytable mt 
    2 USING dual 
    3 ON (mt.id = 'AAA') 
    4 WHEN MATCHED THEN 
    5  UPDATE SET mt.name = 'updated' 
    6 WHEN NOT MATCHED THEN 
    7  INSERT (mt.id , mt.name) 
    8  VALUES ('AAA', 'Gooood'); 

1 row merged. 

SQL> select * from mytable; 

ID NAME 
--- ------------------------------ 
AAA Gooood 
+0

Tôi cũng vậy trên 10.2.0.4. – DCookie

+0

Tôi sử dụng Oracle 9.2 ... Tôi nghe chức năng MERGE là "tốt hơn" trên Oracle 10: - / – Jalil