2010-02-25 78 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