Merge用法:Oracle 10g中对Merge语句的增强
在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语句的增强相关推荐
- Oracle 10g中对resumable session的增强
从9i开始,Oracle提供了一种避免因为space Error而导致事务异常的操作,那就是resumable.通常,DBA在日常工作中,往往忽略了对空间资源上的需求,比如一个大的事务所需要的temp ...
- oracle 10g sga_target,Oracle 10g 中sga_max_size 和sga_target用法
每次要修改sga的时候,都发现把这两个参数记错了,今天整理了一下用法,但愿不会再忘记了[@more@] 一.oracle 10g中的SGA_MAX_SIZE与SGA_TARGET参数 sga_targ ...
- oracle10gasmcmd,ORACLE 10g中ASMCMD使用及ASM文件
ORACLE 10g中ASMCMD使用及ASM文件XML DB访问 1.引言 自动存储管理(ASM)是Oracle数据库10g的新功能,它为数据库管理员提供了一个简单的存储管理界面,并且该界面在所有服 ...
- oracle 对象不在回收站中,Oracle 10G 中的回收站
Oracle 10G 中的"回收站"出处:互联网 回收站,从原理上来说就是一个数据字典表,放置用户Drop掉的数据库对象信息.用户进行Drop操作的对象并没有被数据库删除,仍然会占 ...
- oracle数据库中的回收站,Oracle 10G 中的"回收站"-数据库专栏,ORACLE
oracle 10g 中的"回收站" by fenng http://www.dbanotes.net 在oracle 10g中,引入了一个回收站(recycle bin)的概念. ...
- oracle安装 sysi,在Oracle 10g 中如何以sys的身份登录isqlplus页面
在linux上安装完成Oracle 10g以后,我们常常会用到isqlplus来执行SQL语句.但正常的isqlplus登录界面只支持以普通用户的身份进行登录,而我们有时又必须用到sys身份的权限才能 ...
- oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到
oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到? 原因:数据库中插入数据时没有commit,执行COMMIT后就可以查询到. 转载于:https://www.cnblogs.co ...
- oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库
oracle --10g 中Duplicate 复制数据库 本次实验通过duplicate命令,在本机环境中创建一个复制数据库.目标数据库为hongye.复制数据库为catdb. 环境别名设置: al ...
- 复制oracle9i数据库,Oracle 10g 中Duplicate 复制数据库
Oracle 10g 中Duplicate 复制数据库,本次实验通过duplicate命令,在本机环境中创建一个复制数据库.目标数据库为hongye.复制数 本次实验通过duplicate命令,在本机 ...
最新文章
- Python 是一门动态的、强类型语言
- RP2836 OUT0-OUT7 对应关系
- 信息系统项目管理师-案例分析
- 机器学习中用到的概率知识_机器学习中有关概率论知识的小结
- 删除字符串中重复的字符
- An SSH installation couldn‘t be found
- Xcode安装及卸载
- Python学习 Day8-2 python的三元表达式(三目运算符)、lambda表达式、内置函数
- Deep Learning 和 Knowledge Graph howto
- RHCE-PXE无人值守装机一
- 「leetcode」860.柠檬水找零【贪心算法】详细!
- vue 文字转语音mp3_vue项目或网站上实现文字转换成语音播放功能
- Xshell免费版安装 常用连接linux工具
- arma模型 java_ARMA模型与ARIMA模型java实现例程
- matlab 系数矩阵存储,用Matlab对矩阵进行LU分解法 值得收藏
- 到底何为产品架构师?
- 适合新手的python练习(9)
- centos虚拟机上网慢的问题
- mysqldatareader什么意思_Mysql的MySqlDataReader对于MysqlConnection是独占式
- 数据接口-免费版(股票数据API)