天天看點

Oracle merge into 函數 (增量更新、全量更新)說明merge into 使用Oracle 示例腳本

說明

1、資料導入功能,存在全量更新/增量更新的問題,簡單記錄使用 oracel 的 merge into 函數。

2、全量更新(覆寫模式):資料庫存在該條資料時,做更新操作。不存在時,做新增操作

3、增量更新(跳過模式):資料庫存在該條資料時,不做任何操作,不存在時,做新增操作。

4、merge into 對千萬級以上的資料更新,速度比較慢。

merge into 使用

merge into [target-table] A 
   using [source-table sql] B
    on ([conditional expression] and [...]...)
when matched then      -- 當on中的條件比對時
	[update sql]       -- 執行操作   更新或删除等
when not matched then  -- 當on中的條件不比對時
	[insert sql]       -- 執行操作   新增等

/**

該文法用于:
    判斷B表和A表是否滿足ON中條件,如果滿足則用B表去更新A表(或其他操作),
    如果不滿足,則将B表資料插入A表但是有很多可選項(或其他操作).
    
其中:B表是作為條件來源或資料對比的作用,實際操作,一般是針對A表.

**/


           

Oracle 示例腳本

/************** 全量更新(覆寫模式)*****************/

merge into im_supply_function v
      using (select 'kn0fh34s4nr56hs3ndf5hs' supply_service_code,
                    'sdf345gs2fd23h4fg56ysd' function_code,
                    '功能名稱' function_name,
                    'www.baidu.com' target,
                    '2019-03-01 14:03:35' create_time,
                    '建立人' create_user,
                    '備注' remarks
                from dual) d
on (v.function_code = d.function_code)   -- 這裡通過主鍵判斷,資料是否存在
 when matched then
       update set 
            v.supply_service_code = d.supply_service_code,
            v.function_name = d.function_name,
            v.target = d.target,
            v.create_time = to_date(d.create_time, 'yyyy-mm-dd hh24:mi:ss'),
            v.create_user = d.create_user,
            v.remarks = d.remarks
when not matched then
        insert (
           v.supply_service_code,
           v.function_code,
           v.function_name,
           v.target,
           v.create_time,
           v.create_user,
           v.remarks)
        values (
           d.supply_service_code,
           d.function_code,
           d.function_name,
           d.target,
           to_date(d.create_time, 'yyyy-mm-dd hh24:mi:ss'),
           d.create_user,
           d.remarks
        ) ;        


/************** 增量更新(跳過模式)*****************/

merge into im_supply_function v
      using (select 'kn0fh34s4nr56hs3ndf5hs' supply_service_code,
                    'sdf345gs2fd23h4fg56ysd' function_code,
                    '功能名稱' function_name,
                    'www.baidu.com' target,
                    '2019-03-01 14:03:35' create_time,
                    '建立人' create_user,
                    '備注' remarks
                from dual) d
on (v.function_code = d.function_code)   -- 這裡通過主鍵判斷,資料是否存在
when not matched then
        insert (
           v.supply_service_code,
           v.function_code,
           v.function_name,
           v.target,
           v.create_time,
           v.create_user,
           v.remarks)
        values (
           d.supply_service_code,
           d.function_code,
           d.function_name,
           d.target,
           to_date(d.create_time, 'yyyy-mm-dd hh24:mi:ss'),
           d.create_user,
           d.remarks
        ) ;       



           

繼續閱讀