oracle merge从9i到10g的增强
2012-08-05 20:16
260 查看
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
下面看个具体例子:
下面稍微修改一下例子:
这个错误是使用MERGE最常见的错误,造成这个错误的原因是由于通过连接条件得到的源表的记录不唯一。在merge into时需要设定一个key值,会根据这个key值来决定merge into的操作(update还是insert into),所以要求在merge时这个key值是唯一的。所以要先从源表中选出全部数据而且key值是唯一的。
还有一个错误也是比较常见的:
10g增强一:where子句
下面看一个小例子:
10g增强二:delete子句
下面看个具体例子:
hr@ORCL> select * from p; ID NAME ---------- ---------- 1 d 3 e 8 f hr@ORCL> select * from t; ID NAME ---------- ---------- 1 a 2 b 3 c hr@ORCL> merge into t using p 2 on (t.id=p.id) 3 when matched then 4 update set 5 t.name=p.name 6 when not matched then 7 insert values 8 (p.id,p.name) 9 ; 3 rows merged. hr@ORCL> select * from t; ID NAME ---------- ---------- 1 d 2 b 3 e 8 f hr@ORCL> commit; Commit complete.
下面稍微修改一下例子:
hr@ORCL> insert into p values(1,'h'); 1 row created. hr@ORCL> commit; Commit complete. hr@ORCL> merge into t using p 2 on (t.id=p.id) 3 when matched then 4 update set 5 t.name=p.name 6 when not matched then 7 insert values 8 (p.id,p.name) 9 ; merge into t using p * ERROR at line 1: ORA-30926: unable to get a stable set of rows in the source tables
这个错误是使用MERGE最常见的错误,造成这个错误的原因是由于通过连接条件得到的源表的记录不唯一。在merge into时需要设定一个key值,会根据这个key值来决定merge into的操作(update还是insert into),所以要求在merge时这个key值是唯一的。所以要先从源表中选出全部数据而且key值是唯一的。
还有一个错误也是比较常见的:
hr@ORCL> create table mm (id number,name varchar2(10)); Table created. hr@ORCL> create table mn (id number,name varchar2(10)); Table created. hr@ORCL> insert into mm values(1,'A'); 1 row created. hr@ORCL> insert into mn values(1,'B'); 1 row created. hr@ORCL> merge into mn using mm 2 on (mn.id=mm.id) 3 when matched then 4 update set mn.id=mm.id 5 when not matched then 6 insert values 7 (mm.id,mm.name); on (mn.id=mm.id) * ERROR at line 2: ORA-38104: Columns referenced in the ON Clause cannot be updated: "MN"."ID"
10g增强一:where子句
下面看一个小例子:
hr@ORCL> select * from p; ID NAME ---------- ---------- 1 d 2 f 7 g hr@ORCL> select * from t; ID NAME ---------- ---------- 1 a 2 b 3 c hr@ORCL> merge into t using p 2 on (p.id=t.id) 3 when matched then 4 update set 5 t.name=p.name 6 where p.id=2; 1 row merged. hr@ORCL> select * from t; ID NAME ---------- ---------- 1 a 2 f 3 c
10g增强二:delete子句
hr@ORCL> select * from p; ID NAME ---------- ---------- 1 d 2 f 7 g hr@ORCL> select * from t; ID NAME ---------- ---------- 1 a 2 f 3 c hr@ORCL> merge into t using p 2 on (p.id=t.id) 3 when matched then 4 update set 5 t.name=p.name 6 delete where 7 (t.id=2); 2 rows merged. hr@ORCL> select * from t; ID NAME ---------- ---------- 1 d 3 c
相关文章推荐
- 闪回查询,9i,10G到11G的不断增强
- oracle 9i,10g,11c下载地址
- Install Oracle 9i/10g On RHEL AS 3
- Oracle 10g中对Merge语句的增强
- [官方文档] oracle官方文档总汇(9i,10g,11gR1, 11gR2)
- 9i和10g中的initrans,maxtrans参数
- ORACLE EXP/IMP的使用详解 (解决9i(window)导入到10G的乱码问题)
- oracle 9i,10G,11G,各版本下载资源(使用迅雷),收集好久,分享上来!
- oracle 9i,10g,11g补丁下载地址大全
- orcale 9i连接10G
- Oracle Database 9i/10g/11g编程艺术 笔记
- Oracle 9i和10g安装后的基本环境与服务
- 从9i导出10g内容报 EXP-00003错误
- Oracle 补丁全集 (Oracle 9i 10g 11g Path)
- oracle 9i/10g安装包和PATCH下载地址汇总
- Merge用法:Oracle 10g中对Merge语句的增强
- Oracle 9i 、 10g 、 11g 软件和补丁的下载地址
- oracle 9i,10G,11G,各版本下载资源(使用迅雷),收集好久,分享上来!
- oracle 8i 、oracle 9i 、oracle 10g 和oracle 11g区别详细剖析
- Oracle 8i/9i/10g/11g 组件(Components) 说明