场景:项目中表变更情况复杂,可能有行级的增减情况。与另外的系统产生联动,判断表状态,写入接口表,接口表中另外的数据由另外系统来补充。
在业务开始初期,没有直接确定使用触发器的方案,后期与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
--语句关联后失败匹配语句
--语句后要写;号
至此开发完成,自测通过。
如有错误,望指正,谢谢。