Oracle中merge into的使用

 

我们操作数据库的时候,有时候会遇到insertOrUpdate这种需求。
如果数据库中存在数据就update,如果不存在就insert。
以前的时候,需要额外select查询一下,如果有数据就update,如果没有数据就insert。
而现在Orcale数据库都提供了 MERGE 方法来处理这种需求。
MERGE 命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据。

MERGE 语法:
MERGE INTO [your table-name] [rename your table here] 
USING ( [write your query here] )[rename your query-sql and using just like a table] 
ON ([conditional expression here] AND [...]...) 
WHEN MATCHED THEN [here you can execute some update sql or something else ] 
WHEN NOT MATCHED THEN [execute something else here ! ] 
使用例子:
create table TEST (ID INTEGER,VALUE VARCHAR2(255) );   
insert into TEST values (1, 'test1');   
insert into TEST values (2, 'test2');   
 
我们想插入一条数据  {ID=2,NAME='newtest2'}  那么可以这么写
MERGE INTO  TEST T1
USING (SELECT '2' as ID, 'newtest2' as NAME FROM dual) T2 on (T1.ID=T2.ID)
WHEN MATCHED THEN UPDATE SET T1.NAME=T2.NAME
WHEN NOT MATCHED THEN  INSERT (T1.ID, T1.NAME) VALUES (T2.ID, T2.NAME ); 
 
如果ID为2的数据存在那么 UPDATE,如果不存在INSERT
 
注意事项:
Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 
当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。
所以要想让Merge Into正常运行,
要保证USING 
后面的SELECT有数据,
个人喜欢使用DUAL表作为USING后的表,
方便自己控制。
merge into ZX_PUB_IMP_SU_DOC t --待更新表
    using (select t1. * from BMS_SU_DTL t1,bms_su_doc t2 where t1.sudocid=t2.sudocid) b --数据源可以语句可以直接是单表
    on (t.dtlid = b.IMPDTLID) --关联关系
    WHEN matched THEN --判断存在更新
      update
         set t.newid = b.SUDOCDTLID
       where t.docid = p_impid
         and t.impstatus = 3
         WHEN not matched THEN --判断不存在更新
           insert 
           (t.a)
           values 
           (b.a);

 

你可能感兴趣的:(数据库)