WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院数据库Oracle 使用Oracle 10gMERGE语句更新数据行 阅读

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

 2007-06-02 16:04:27 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姇閻忔氨鈧凹鍓熷娲垂椤曞懎鍓伴梺閫炲苯澧紒澶婄秺瀵濡歌閸嬫捇妫冨☉娆忔殘闂佷紮缍€娴滎剟鍩€椤掑倹鏆柛瀣躬瀹曚即寮借閺嗭箓鏌ㄩ悤鍌涘
核心提示:在Oracle 9i R2版中引入的MERGE语句通常被称作“更新插入”(upsert),因为使用MERGE可以在同一个步骤中更新(update)并插入(insert)数据行,使用Oracle 10gMERGE语句更新数据行,对于抽取、转换和载入类型的应用软件可以节省大量宝贵的时间,比如向数据仓

在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语句。

Tags:使用 Oracle gMERGE

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接