科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>软件频道>数据库-zhiding>使用Oracle 10gMERGE语句更新数据行

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行,对于抽取、转换和载入类型的应用软件可以节省大量宝贵的时间。

Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行,对于抽取、转换和载入类型的应用软件可以节省大量宝贵的时间,比如向数据仓库中加载数据,数据仓库中没有的数据行可以插入到数据仓库中,而已经存在的数据行也同时被更新。

MERGE语句引入的时候,需要同时使用一条UPDATE和一条INSERT语句,顺序也是固定的(先使用UPDATE语句,然后是INSERT语句)。如果您只需要使用其中的某一条一句,您只需要使用现有的INSERT或者UPDATE语句,而不必使用MERGE语句,而删除数据可以使用DELETE语句。

Oracle 10g R1版中,MERGE语句发生了变化,UPDATEINSERT语句不再是必须的,而是可选项,您可以两者都用也可以都不用,而且,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语句。

责任编辑:德东

查看本文国际来源

推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题