2010-02-25 75 views
7

我有這個簡單的例子,我不能似乎得到工作:甲骨文MERGE不插入

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'); 

如果「AAA」記錄存在於表中,它成功地更新。

但是,如果不存在,它沒有插入:

Affected rows: 0 
Time: 0.003ms 

什麼我做錯了任何線索?

+0

你在使用響應 「受影響的行:0時間:0.003ms」 的工具? – 2010-02-25 18:10:15

+0

有人想知道OP是否在沒有提交的情況下合併在一個會話中並且從另一個會話中查詢。或者現有的應用程序是否正確解釋來自SQL%ROWCOUNT模擬的輸出。 – 2010-02-25 18:39:44

+0

是否有可能你的表'mytable'需要的不僅僅是'id'和'name'來做一個有效的插入? – 2010-02-25 19:28:33

回答

8

工作對我來說:

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

我也在10.2.0.4上。 – DCookie 2010-02-25 18:12:23

+0

我使用Oracle 9.2 ...我聽說Oracle 10上的MERGE函數「更好」: - / – Jalil 2010-02-25 22:11:05