Oracle ~ merge into 函数 (增量更新、全量更新)

Oracle merge into 函数 增量更新、全量更新

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表.

**/

需要需要注意的细节:

merge into aiskbus.STUDENT_INFO a 
using (select * from aiskbus.stu )b  --此处( ) 中必须写 select ,不可以致谢表名,不然会报错没有select关键字,别名 b 要在括号外
on(a.name = b.name)
when not matched then 
INSERT (a.id,     --此处可以写所有字段
a.name,
a.class_id,
a.chinese,
a.math,
a.english)
 VALUES (b.id,
b.name,
b.class_id,
b.chinese,
b.math,
b.english)
when matched then          --此处不可以写在 on 中写过的字段名
update set
a.id   =  b.id,
a.class_id   =  b.class_id,
a.chinese  =  b.chinese,
a.math   =  b.math,
a.english  =  b.english

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




  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值