9i R2 引入 MERGE (Upsert) 必須同時指定 WHEN MATCHED THEN UPDATE 與 WHEN NOT MATCHED THEN INSERT。10g R1 大幅放寬:
UPDATE、INSERT 子句**皆為可選**,可只做其中之一。UPDATE 子句新增 DELETE WHERE,可在同步更新時清理廢棄資料。-- 目標表
CREATE TABLE open_projects (pno NUMBER(6) PRIMARY KEY, title VARCHAR2(40), startdate DATE, pctdone NUMBER(3), empno NUMBER(6));
-- 異動表
CREATE TABLE project_updates (action CHAR(1), pno NUMBER(6), 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);
INSERT INTO project_updates VALUES ('C',10,50,214); -- 更新專案 10
INSERT INTO project_updates VALUES ('D',20,NULL,NULL); -- 刪除專案 20
COMMIT;
MERGE INTO open_projects op
USING project_updates pu
ON (op.pno = pu.pno)
WHEN MATCHED THEN
UPDATE SET op.pctdone = pu.pctdone, op.empno = pu.empno
DELETE WHERE pu.action = 'D'; -- action='D' 刪除該列
-- 無 WHEN NOT MATCHED 則不插入新專案
展示 10g MERGE **單一陳述式同時完成更新、刪除、保留**,且 INSERT 子句可省略,極大簡化 ETL 邏輯。