- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的服务器维护,企业网站维护,网站维护服务
- (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
 
  
    
| 作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0 | 
在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行,对于抽取、转换和载入类型的应用软件可以节省大量宝贵的时间,比如向数据仓库中加载数据,数据仓库中没有的数据行可以插入到数据仓库中,而已经存在的数据行也同时被更新。
在MERGE语句引入的时候,需要同时使用一条UPDATE和一条INSERT语句,顺序也是固定的(先使用UPDATE语句,然后是INSERT语句)。如果您只需要使用其中的某一条一句,您只需要使用现有的INSERT或者UPDATE语句,而不必使用MERGE语句,而删除数据可以使用DELETE语句。
在Oracle 10g R1版中,MERGE语句发生了变化,UPDATE或INSERT语句不再是必须的,而是可选项,您可以两者都用也可以都不用,而且,UPDATE语句也具备了DELETE的功能,您可以在同一个步骤中对现有的有效记录进行升级并清理废弃的记录。
列表A创建了一个表格列出现有项目:项目号码、标题、开始日期、进度完成比例以及员工对项目的响应,还创建了一个事务表格使用MERGE语句进行升级批处理。
  DROP TABLE open_projects; 
  DROP TABLE project_updates; 
  CREATE TABLE open_projects 
  (pno NUMBER(6) PRIMARY KEY, 
  title VARCHAR2(40), 
  startdate DATE, 
  pctdone NUMBER(3), 
  empno NUMBER(6) 
  ); 
  INSERT INTO open_projects VALUES 
  (10, 'Inventory servers', '08-JAN-07',0, 206); 
  INSERT INTO open_projects VALUES 
  (20, 'Upgrade Oracle on SRV01','15-JAN-07', 0, 206); 
  INSERT INTO open_projects VALUES 
  (30, 'Conduct skills assessment','22-JAN-07', 0, 210); 
  CREATE TABLE project_updates 
  (action CHAR(1), 
  pno NUMBER(6), 
  pctdone NUMBER(3), 
  empno NUMBER(6) 
  ); 
  INSERT INTO project_updates VALUES 
  ('C', 10, 50, 214); 
  INSERT INTO project_updates VALUES 
  ('D', 20, NULL, NULL); 
  COMMIT; 
列表A
一个典型的MERGE语句从识别表格开始执行升级,而且对现有的记录进行筛选测试:
  MERGE INTO open_projects op 
  USING project_updatespu 
  ON (op.pno = pu.pno) 
  ... 
表格open_projects会接受更新的数据,而project_updates表格则不会改变,如果项目号码(pno)在两个表格中都一样,那么数据行则被认为是相同的。
MERGE语句剩下的部分是更新语句,以及DELETE WHERE语法。
  WHEN MATCHED THEN 
  UPDATE SET pctdone = pu.pctdone, 
  empno = pu.empno 
  DELETE 
  WHERE pu.action = 'D'; 
列表B展示了MERGE语句运行前后的表格情况。
  SQL> @mergedel_b 
  PNO TITLE STARTDATE PCTDONE EMPNO 
  ---------- ---------------------------------------- --------- ---------- ---------- 
  10 Inventory servers 08-JAN-07 0 206 
  20 Upgrade Oracle on SRV01 15-JAN-07 0 206 
  30 Conduct skills assessment 22-JAN-07 0 210 
  A PNO PCTDONE EMPNO 
  - ---------- ---------- ---------- 
  C 10 50 214 
  D 20 
  2 rows merged. 
  PNO TITLE STARTDATE PCTDONE EMPNO 
  ---------- ---------------------------------------- --------- ---------- ---------- 
  10 Inventory servers 08-JAN-07 50 214 
  30 Conduct skills assessment 22-JAN-07 0 210 
  A PNO PCTDONE EMPNO 
  - ---------- ---------- ---------- 
  C 10 50 214 
  D 20 
  SQL> spool off 
列表B
第一个事务对第10号项目进行了改变(操作‘c’),项目完成比例从0变成了50,项目员工人数变成了214人;第二个事务产出了第20号项目,“随后”的列表展示了删除后的状态,而project_updates表格没有发生改变。这个例子展示了这些语句并不是必须的,而且在MERGE语句中也并不需要使用INSERT语句。
| 我要申请本站:N点 | 黑客防线官网 | | 
| 专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |