天天看點

Oracle Merge into語句

研究這個語句完全是為了偷懶而使用的。

因為在Java寫背景程式的時候,經常會出現存在則UPDATE,不存在則INSERT的需求。

用SQL來完成就是要做3條SQL,用Hibernate寫就就友善咯。

可是我用的是iBatis,就要寫三條了。。

簡單地說一下這個SQL吧。

MERGE INTO target_tbl a   
USING new_record b   
ON (a.product_id = b.product_id)   
WHEN MATCHED THEN  
UPDATE  SET a.product_name = b.product_name,   
                   a.category = b.category
WHEN NOT MATCHED THEN 
INSERT VALUES (b.product_id, b.product_name, b.category)   
WHERE b.category != 'BOOKS' 
;
           

merge into 關鍵字後面接着的是目标表,就是最終會改變資料的表。

using後面接的是結果集,可以是一個表,也可以是一條SQL查詢語句。

ON 很顯然是連接配接條件。

在後面的matched 和 NOT matched 的情況下,都和原有的INSERT UPDATE語句差不多,就是省去了寫表名的動作。

又查了一下,merge into還可以附加delete操作呢。

可謂是非常強大,我的使用其實很簡單:

MERGE INTO T T1

Oracle Merge into語句

USING (SELECT '1001' AS a,2 AS b FROM dual) T2

Oracle Merge into語句

ON ( T1.a=T2.a)

Oracle Merge into語句

WHEN MATCHED THEN

Oracle Merge into語句

  UPDATE SET T1.b = T2.b

Oracle Merge into語句

WHEN NOT MATCHED THEN 

Oracle Merge into語句

  INSERT (a,b) VALUES(T2.a,T2.b);

備注,如果在存儲過程裡面使用了merge語句後,記得一定要COMMIT!!

是的,merge into語句是需要COMMIT的!