当前位置: 首页 > 图文教程 > 数据库 > Oracle > 使用Oracle 10gMERGE语句更新数据行

Oracle
Oracle常用dump命令,记录一下备查。
Oracle存储过程之数据库中获取数据实例
Oracle存储过程入门学习基本语法
java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input
Oracle 函数大全[字符串函数,数学函数,日期函数]
Oracle 自增(auto increment) 或 标识字段的建立方法
oracle 存储过程加密的方法
Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁
Oracle 忘记密码的找回方法
Oracle 数据库导出(exp)导入(imp)说明
oracle 常见等待事件及处理方法
Oracle9i 动态SGA,PGA特性探索
PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法
ORACLE 数据库RMAN备份恢复
用Mimer Validator检查SQL查询
oracle执行cmd的实现方法
ORACLE 正则解决初使化数据格式不一致
Oracle 触发器的使用小结
oracle 时间格式的调整
Oracle 10g的DBA无法登录解决方案

使用Oracle 10gMERGE语句更新数据行


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-31   浏览: 102 ::
收藏到网摘: n/a

  在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 STA