Oracle merge into関数(インクリメンタル更新、フル更新)

3159 ワード

説明
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
        ) ;