网址:  http://www.eygle.com/digest/2009/02/mergeoracle_10gmerge.html

在Oracle 10g之前,merge语句支持匹配更新和不匹配插入2种简单的用法,在10g中Oracle对merge语句做了增强,增加了条件选项和DELETE操作。下面我通过一个demo来简单介绍一下10g中merge的增强和10g前merge的用法。

 

参考Oracle 的SQL Reference,大家可以看到Merge Statement的语法如下:
MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] 
{ table | view | subquery } [t_alias] ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

下面我在windows xp 下10.2.0.1版本上做一个测试看看

SQL> select * from v$version;BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - ProductionSQL>
一、创建测试用的表
SQL> create table subs(msid number(9),2                    ms_type char(1),3                    areacode number(3)4                    );表已创建。SQL> create table acct(msid number(9),2                    bill_month number(6),3                    areacode   number(3),4                    fee        number(8,2) default 0.00);表已创建。SQL>
SQL> insert into subs values(905310001,0,531);已创建 1 行。SQL> insert into subs values(905320001,1,532);已创建 1 行。SQL> insert into subs values(905330001,2,533);已创建 1 行。SQL> commit;提交完成。SQL> 二、下面先演示一下merge的基本功能1) matched 和not matched clauses 同时使用merge into acct a using subs b on (a.msid=b.msid)when MATCHED thenupdate set a.areacode=b.areacodewhen NOT MATCHED theninsert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode);
2) 只有not matched clause,也就是只插入不更新merge into acct a using subs b on (a.msid=b.msid)   when NOT MATCHED theninsert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode);3) 只有matched clause, 也就是只更新不插入merge into acct a using subs b on (a.msid=b.msid)when MATCHED thenupdate set a.areacode=b.areacodeConnected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as studySQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905310001 0            531905320001 1            532905330001 2            533SQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when MATCHED then4          update set a.areacode=b.areacode5     when NOT MATCHED then6          insert(msid,bill_month,areacode) 7          values(b.msid,'200702',b.areacode);DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905320001     200702      532       0.00905330001     200702      533       0.00905310001     200702      531       0.00SQL> insert into subs values(905340001,3,534);1 row insertedSQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905340001 3            534905310001 0            531905320001 1            532905330001 2            533SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when NOT MATCHED then4          insert(msid,bill_month,areacode) 5          values(b.msid,'200702',b.areacode);DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905320001     200702      532       0.00905330001     200702      533       0.00905310001     200702      531       0.00905340001     200702      534       0.00SQL> update subs set areacode=999;4 rows updatedSQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905340001 3            999905310001 0            999905320001 1            999905330001 2            999SQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905320001     200702      532       0.00905330001     200702      533       0.00905310001     200702      531       0.00905340001     200702      534       0.00SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when MATCHED then4          update set a.areacode=b.areacode;DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905320001     200702      999       0.00905330001     200702      999       0.00905310001     200702      999       0.00905340001     200702      999       0.00SQL> 三、10g中增强一:条件操作1) matched 和not matched clauses 同时使用merge into acct a using subs b on (a.msid=b.msid)     when MATCHED thenupdate set a.areacode=b.areacodewhere b.ms_type=0when NOT MATCHED theninsert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode)where b.ms_type=0;
2) 只有not matched clause,也就是只插入不更新merge into acct a using subs b on (a.msid=b.msid)   when NOT MATCHED theninsert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode)where b.ms_type=0;3) 只有matched clause, 也就是只更新不插入merge into acct a using subs b on (a.msid=b.msid)when MATCHED thenupdate set a.areacode=b.areacodewhere b.ms_type=0;Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as studySQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905310001 0            531905320001 1            532905330001 2            533SQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when MATCHED then4          update set a.areacode=b.areacode5          where b.ms_type=06     when NOT MATCHED then7          insert(msid,bill_month,areacode) 8          values(b.msid,'200702',b.areacode)9          where b.ms_type=0;DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905310001     200702      531       0.00SQL> insert into subs values(905360001,0,536);1 row insertedSQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905360001 0            536905310001 0            531905320001 1            532905330001 2            533SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when NOT MATCHED then4          insert(msid,bill_month,areacode) 5          values(b.msid,'200702',b.areacode)6          where b.ms_type=0;DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905310001     200702      531       0.00905360001     200702      536       0.00SQL> update subs set areacode=888 where ms_type=0;2 rows updatedSQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905360001 0            888905310001 0            888905320001 1            532905330001 2            533SQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905310001     200702      531       0.00905360001     200702      536       0.00SQL>
SQL> merge into acct a2       using subs b on (a.msid=b.msid)3     when MATCHED then4          update set a.areacode=b.areacode5          where b.ms_type=0;DoneSQL> select * from acct;MSID BILL_MONTH AREACODE        FEE
---------- ---------- -------- ----------905310001     200702      888       0.00905360001     200702      888       0.00SQL>
四、10g中增强二:删除操作
An optional DELETE WHERE clause can be used to clean up after a
merge operation. Only those rows which match both the ON clause
and the DELETE WHERE clause are deleted.merge into acct a using subs b on (a.msid=b.msid)when MATCHED thenupdate set a.areacode=b.areacode        delete where (b.ms_type!=0);             SQL> select * from subs;MSID MS_TYPE AREACODE
---------- ------- --------905310001 0            531905320001 1            532905330001 2            533SQL> select * from acct;MSID MS_TYPE AREACODE
---------- ------- --------905310001 0            531905320001 1            532905330001 2            533SQL>
SQL>  merge into acct a2       using subs b on (a.msid=b.msid)3     when MATCHED then4          update set a.areacode=b.areacode5          delete where (b.ms_type!=0);DoneSQL> select * from acct;MSID MS_TYPE AREACODE
---------- ------- --------905310001 0            531SQL> 更为详尽的语法,请参考Oracle SQL Reference手册!原文链接:http://tomszrp.itpub.net/post/11835/263865

Merge用法:Oracle 10g中对Merge语句的增强相关推荐

  1. Oracle 10g中对resumable session的增强

    从9i开始,Oracle提供了一种避免因为space Error而导致事务异常的操作,那就是resumable.通常,DBA在日常工作中,往往忽略了对空间资源上的需求,比如一个大的事务所需要的temp ...

  2. oracle 10g sga_target,Oracle 10g 中sga_max_size 和sga_target用法

    每次要修改sga的时候,都发现把这两个参数记错了,今天整理了一下用法,但愿不会再忘记了[@more@] 一.oracle 10g中的SGA_MAX_SIZE与SGA_TARGET参数 sga_targ ...

  3. oracle10gasmcmd,ORACLE 10g中ASMCMD使用及ASM文件

    ORACLE 10g中ASMCMD使用及ASM文件XML DB访问 1.引言 自动存储管理(ASM)是Oracle数据库10g的新功能,它为数据库管理员提供了一个简单的存储管理界面,并且该界面在所有服 ...

  4. oracle 对象不在回收站中,Oracle 10G 中的回收站

    Oracle 10G 中的"回收站"出处:互联网 回收站,从原理上来说就是一个数据字典表,放置用户Drop掉的数据库对象信息.用户进行Drop操作的对象并没有被数据库删除,仍然会占 ...

  5. oracle数据库中的回收站,Oracle 10G 中的"回收站"-数据库专栏,ORACLE

    oracle 10g 中的"回收站" by fenng http://www.dbanotes.net 在oracle 10g中,引入了一个回收站(recycle bin)的概念. ...

  6. oracle安装 sysi,在Oracle 10g 中如何以sys的身份登录isqlplus页面

    在linux上安装完成Oracle 10g以后,我们常常会用到isqlplus来执行SQL语句.但正常的isqlplus登录界面只支持以普通用户的身份进行登录,而我们有时又必须用到sys身份的权限才能 ...

  7. oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到

    oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到? 原因:数据库中插入数据时没有commit,执行COMMIT后就可以查询到. 转载于:https://www.cnblogs.co ...

  8. oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库

    oracle --10g 中Duplicate 复制数据库 本次实验通过duplicate命令,在本机环境中创建一个复制数据库.目标数据库为hongye.复制数据库为catdb. 环境别名设置: al ...

  9. 复制oracle9i数据库,Oracle 10g 中Duplicate 复制数据库

    Oracle 10g 中Duplicate 复制数据库,本次实验通过duplicate命令,在本机环境中创建一个复制数据库.目标数据库为hongye.复制数 本次实验通过duplicate命令,在本机 ...

最新文章

  1. Python 是一门动态的、强类型语言
  2. RP2836 OUT0-OUT7 对应关系
  3. 信息系统项目管理师-案例分析
  4. 机器学习中用到的概率知识_机器学习中有关概率论知识的小结
  5. 删除字符串中重复的字符
  6. An SSH installation couldn‘t be found
  7. Xcode安装及卸载
  8. Python学习 Day8-2 python的三元表达式(三目运算符)、lambda表达式、内置函数
  9. Deep Learning 和 Knowledge Graph howto
  10. RHCE-PXE无人值守装机一
  11. 「leetcode」860.柠檬水找零【贪心算法】详细!
  12. vue 文字转语音mp3_vue项目或网站上实现文字转换成语音播放功能
  13. Xshell免费版安装 常用连接linux工具
  14. arma模型 java_ARMA模型与ARIMA模型java实现例程
  15. matlab 系数矩阵存储,用Matlab对矩阵进行LU分解法 值得收藏
  16. 到底何为产品架构师?
  17. 适合新手的python练习(9)
  18. centos虚拟机上网慢的问题
  19. mysqldatareader什么意思_Mysql的MySqlDataReader对于MysqlConnection是独占式
  20. 数据接口-免费版(股票数据API)

热门文章

  1. 科斯定理-载罗纳德·科斯
  2. vue table页合并相同数据单元格
  3. 安卓小游戏:飞机大战
  4. 把用户证书安装成系统证书
  5. 界面组件——按钮(Button)与图片按钮(ImageButton)
  6. Tomcat(4)-集群
  7. how-I-hacked-Facebook-again-unauthenticated-RCE-on-MobileIron-MDM笔记
  8. TCP/IP协议知多少
  9. 往word表中写数据
  10. 项目 - Web地图开发【高德地图API】(一)