首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 10g MERGE 語句進化:可選 UPDATE/INSERT、支援 DELETE、單一陳述式完成 Upsert 與清理

     編輯:Oracle 資料庫相關知識

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 語句

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 則不插入新專案

執行結果

  • 專案 10:完成度 0→50,負責人 206→214。
  • 專案 20:被刪除。
  • 專案 30:無異動保持原狀。
  • project_updates 表內容不變。

展示 10g MERGE **單一陳述式同時完成更新、刪除、保留**,且 INSERT 子句可省略,極大簡化 ETL 邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved