oracle数据通过触发器使用merge语句同步

场景:项目中表变更情况复杂,可能有行级的增减情况。与另外的系统产生联动,判断表状态,写入接口表,接口表中另外的数据由另外系统来补充。

 

在业务开始初期,没有直接确定使用触发器的方案,后期与leader确认时发现数据发生变化的场景很多且复杂。商议后确定使用触发器。
 

CREATE OR REPLACE TRIGGER 表空间.触发器名
AFTER(触发时机,可以是之前或者之后) update(触发的操作是什么,可以是新增修改之类的操作) OF 变更的行中的值 ON 表  FOR EACH ROW    

DECLARE              
    声明变量处
        
BEGIN
    变量赋值处 使用new. 调用到变化行的数据
 IF
      判断条件
THEN      
    
执行的sql语句

END IF ;        

END;

逻辑判断语法与plsql中case when then else 类似。

触发器是从之前的触发器基础上改造的,但是有一个问题,在于之前场景是批量同步的,之前有数据进行删除,删除后批量增加,这种操作不符合当前业务,会导致外部系统写入数据丢失。

于是对触发器进行了部分改造,先调用update语句更新已在表中存在数据,之后插入新增加的数据。这种思路在自测的时候发现了问题,update语句如果没有更新到数据,会直接抛出异常,导致程序不会继续执行下去。(这里具体问题未知)

解决思路是通过merge语句控制语句的执行流程。

MERGE INTO 表空间.表名(要写入的表) l
USING (
    查询语句,查询出全量要操作的数据
  	
) o ON (o.condition = l.condition ) (关联条件,一定要用括号括起来)

WHEN MATCHED THEN 
    -- 当匹配得上连接条件时 执行语句 语句后要写;号
WHEN NOT MATCHED THEN 
  --语句关联后失败匹配语句

  --语句后要写;号

 

至此开发完成,自测通过。

如有错误,望指正,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值