自从版本9i之后,对于“有则更新,无则插入”有了一个新的用法,不需要再执行2次SQL了。
merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。MERGE INTO本来应该是用来合并表的,不过因为其特性,根据用途不同可以用在以下场合: 关键字、参数
into 子句
在into子句中指定所要修改或者插入数据的目标表
using 子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
on 子句
在on子句中指定执行插入或者修改的满足条件。在目标表中符合条件的每一行,Oracle用数据源中的相应数据修改这些行。对于不满足条件的那些行,oracle则插入数据源中相应数据。
when matched | not matched
用该子句通知oracle如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
1.合并表
2.外部数据插入更新
3.用JOIN表更新 各种情况下的
1.合并表
把表格T2的数据合并到表格T1里,根据结合条件,如果存在则更新,不存在则插入 MERGE INTO T1USING T1 ON( T1.user_id = T2.user_id)WHEN MATCHED THEN UPDATE SET T1.user_nm = T2.user_nmWHEN NOT MATCHED THEN INSERT (user_id,user_nm) VALUES (T2.user_id,T2.user_nm)
2.外部数据插入更新 根据外部传进来的参数,如果存在的话,用给定的参数更新,如果不存在则插入 MERGE INTO T1USER DUAL ON( T1.user_id = "001")WHEN MATCHED THEN UPDATE SET T1.user_nm = "David Vi"WHEN NOT MATCHED THEN INSERT (user_id, user_nm) VALUES ("001","David Vi")
3.用JOIN表更新
这个其实和第一个应用差不多,就是USING内部是个多个表进行结合的子表,根据多个表的结合查询然后对对象表进行更新。 对于第1,3应用有个问题,就是更新对象表和USING表(子表)是1:N的关系的话,无法更新。
另外,对于第3个应用,不如用VIEW更新来的快。Oracle中merge into的使用ORA-12154 TNS 无法解析指定的连接标识符相关资讯 Oracle基础教程
- Oracle块编程返回结果集详解 (11/10/2013 10:45:58)
- Oracle基础教程之设置系统全局区 (08/22/2013 14:24:00)
- Oracle基础教程知识点总结 (06/18/2013 07:43:32)
| - Oracle基础教程之tkprof程序详解 (10/22/2013 11:49:50)
- Oracle基础教程之sqlplus汉字乱码 (07/18/2013 16:30:00)
- Oracle 管理之 Linux 网络基础 (02/16/2013 18:37:35)
|
本文评论 查看全部评论 (0)