oracle数据库的触发器迁移到KingbaseES的时候经常会出现一下两类错误:

1.SQL 错误 [42809]: 错误: "xxxxxxxx" 是一个视图。Detail: 视图上的触发器不能有转换表。

2.SQL 错误 [0A000]: 错误: 不能为具有多个事件的触发器指定转换表

这两类问题都可以通过使用触发器函数来进行改写。

下面来看下具体的例子:

示例1

oracle触发器内容:
CREATE TRIGGER TRG_FIN_IPR_INMAININFO INSTEAD OF
UPDATE ON VIEW_FIN_IPR_INMAININFOMONTHER REFERENCING NEW AS N FOR EACH ROW DECLARE -- LOCAL VARIABLES HERE
BEGIN IF :N.IN_STATE <> 'O'
AND (:OLD.BED_NO <> :N.BED_NO OR :OLD.IN_STATE <> :N.IN_STATE ) THEN
UPDATE FIN_IPR_INMAININFO
SET IN_STATE = :N.IN_STATE,BED_NO = :N.BED_NO
WHERE INPATIENT_NO IN (SELECT BABY_INPATIENT_NO FROM FIN_IPR_BABYINFO
WHERE INPATIENT_NO = :N.INPATIENT_NO) AND BABY_FLAG = '0';
END IF;
END TRG_FIN_IPR_INMAININFO; 迁移时报错:SQL 错误 [42809]: 错误: "VIEW_FIN_IPR_INMAININFOMONTHER" 是一个视图。Detail: 视图上的触发器不能有转换表. 使用触发器函数改写:
创建触发器函数
CREATE OR REPLACE FUNCTION TRG_FIN_IPR_INMAININFO_FUN()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.IN_STATE <> 'O' AND (OLD.BED_NO <> NEW.BED_NO OR OLD.IN_STATE <> NEW.IN_STATE ) THEN
UPDATE FIN_IPR_INMAININFO SET IN_STATE = NEW.IN_STATE,BED_NO = NEW.BED_NO
WHERE INPATIENT_NO IN (SELECT BABY_INPATIENT_NO FROM FIN_IPR_BABYINFO
WHERE INPATIENT_NO = NEW.INPATIENT_NO) AND BABY_FLAG = '0';
RETURN NEW;
END IF;
END;
$$LANGUAGE PLPGSQL; 使用触发器函数创建触发器
CREATE TRIGGER TRG_FIN_IPR_INMAININFO INSTEAD OF UPDATE ON VIEW_FIN_IPR_INMAININFOMONTHER
FOR EACH ROW EXECUTE FUNCTION TRG_FIN_IPR_INMAININFO_FUN();

示例2

oracle触发器内容:
CREATE TRIGGER "TRG_ESB_ORDER_DETAIL" AFTER
INSERT OR UPDATE OF VALID_FLAG, VALID_DATE,VALID_USERCD OR DELETE
ON MET_IPM_EXECDRUG REFERENCING NEW AS MYNEW OLD AS MYOLD FOR EACH ROW DECLARE V_ERROCODE NUMBER;
V_ERROTEXT VARCHAR2(200);
BEGIN
IF INSERTING THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,:MYNEW.EXEC_SQN,'MET_IPM_EXECDRUG','INSERT',3,SYSDATE,0,'IPMOMDEX INSERT');
ELSIF UPDATING THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,:MYNEW.EXEC_SQN,'IPMOMDEX','UPDATE',3,SYSDATE,0,'IPMOMDEX UPDATE');
ELSIF DELETING THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,OLD.EXEC_SQN,'IPMOMDEX','DELETE',3,SYSDATE,0,'IPMOMDEX DELETE');
END IF;
EXCEPTION
WHEN OTHERS THEN V_ERROCODE: = SQLCODE;
V_ERROTEXT: = SUBSTR(SQLERRM, 1, 200);
INSERT INTO ESB_ERRO_LOG(ERRO_CODE, ERRO_INFO, ERRO_TIME)
VALUES(V_ERROCODE, V_ERROTEXT, SYSDATE);
END; 迁移时报错:SQL 错误 [0A000]: 错误: 不能为具有多个事件的触发器指定转换表 使用触发器函数改写:
CREATE OR REPLACE FUNCTION TRG_ESB_ORDER_DETAIL_FUN() RETURNS TRIGGER AS $$
DECLARE
V_ERROCODE NUMBER;
V_ERROTEXT VARCHAR2(200);
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,NEW.EXEC_SQN,'MET_IPM_EXECDRUG','INSERT',3,SYSDATE,0,'IPMOMDEX INSERT');
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,NEW.EXEC_SQN,'IPMOMDEX','UPDATE',3,SYSDATE,0,'IPMOMDEX UPDATE');
ELSIF (TG_OP = 'DELETE') THEN
INSERT INTO ESB_ORDER_DETAIL_EVENTS(EVENT_ID,OBJECT_KEY,OBJECT_NAME,OBJECT_VERB,EVENT_PRIORITY,EVENT_TIME,EVENT_STAUS,EVENT_COMMENT)
VALUES(ESB_EVENT_SEQ.NEXTVAL,OLD.EXEC_SQN,'IPMOMDEX','DELETE',3,SYSDATE,0,'IPMOMDEX DELETE');
END IF;
RETURN NEW;
EXCEPTION
WHEN OTHERS THEN
V_ERROCODE := SQLCODE;
V_ERROTEXT := SUBSTR(SQLERRM, 1, 200);
INSERT INTO ESB_ERRO_LOG(ERRO_CODE, ERRO_INFO, ERRO_TIME)
VALUES(V_ERROCODE, V_ERROTEXT, SYSDATE);
END;
$$LANGUAGE PLPGSQL; CREATE TRIGGER "TRG_ESB_ORDER_DETAIL" AFTER
INSERT OR UPDATE OF VALID_FLAG, VALID_DATE,VALID_USERCD OR DELETE
ON MET_IPM_EXECDRUG FOR EACH ROW EXECUTE FUNCTION TRG_ESB_ORDER_DETAIL_FUN();

在本文中,我们探讨了在将Oracle数据库的触发器迁移到KingbaseES过程中遇到的两个常见错误。

示例1和示例2提供了具体的改写方法,帮助我们理解如何在KingbaseES中重新实现这些触发器的功能。这种方法不仅解决了特定的错误,还提供了一种在迁移过程中保持数据完整性和业务逻辑连续性的策略。

Oracle 触发器迁移至KingbaseES常见的问题的更多相关文章

  1. SQL SERVER 2008向ORACLE 11G迁移示例

    来源于:http://www.cnblogs.com/hiizsk/ 由SQL SERVER 2008向ORACLE 11G迁移过程记录之一-表 使用Oracle Sql Developer将SQL ...

  2. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  3. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

  4. oracle触发器中增删改查本表

    oracle触发器中增删改查本表 (1)只有before insert触发器中才可以查询或更新本表 create or replace trigger tri_test_ins before inse ...

  5. Oracle JDK迁移指南

    Oracle JDK迁移指南 https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-C25E2B1D-6C24 ...

  6. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  7. Oracle数据库迁移到AWS云的方案

    当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性.减轻基础设施的维护压力,运维的成本等.很多企业使用云碰到的难题之一是如何将现有的应用迁移到云上,将现有应用的中间件系统.Web系统及其 ...

  8. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  9. oracle 表迁移方法 (二) 约束不失效

    DB:11.2.0.3.0 在oracle 表迁移方法 (一)中,只是move了一张普通的表,如果表的字段带有主键约束呢 ? [oracle@db01 ~]$ sqlplus / as sysdba ...

  10. oracle触发器应用

    首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...

随机推荐

  1. 【Unity3D】Shader常量、变量、结构体、函数

    1 源码路径 ​ Unity Shader 常量.变量.结构体.函数一般可以在 Unity Editor 安装目录下面的[Editor\Data\CGIncludes\UnityShader]目录下查 ...

  2. Android 全面屏体验

    一.概述 Android 应用中经常会有一些要求全屏显隐状态栏导航栏的需求.通过全屏沉浸式的处理可以让应用达到更好的显示效果.在 Android 4.1 之前,只能隐藏状态栏, 在 Android4. ...

  3. dilb安装的三种方法

    dilb库安装失败,源码安装嘎嘎报错,所以这里记录一下 dlib库是一个很特殊的库,在下载dlib库之前需要下载两个库(cmake.boost这两个库) pip install cmake boost ...

  4. 目标检测 - VOC - xml标注格式

    目标检测 - VOC - xml标注格式 相对其他计算机视觉任务,目标检测算法的数据格式更为复杂.为了对数据进行统一的处理,目标检测数据一般都会做成VOC或者COCO的格式. XML标注格式 < ...

  5. PHP项目&MVC文件安全&上传&包含&下载&删除&读取等

    文件安全-文件包含-动态调试-xhcms 1.安装好xhcms,查看index.php文件. 2.存在include关键字,可以存在文件包含漏洞.看上面代码的逻辑,对r的传参添加魔术引号,如果r没有值 ...

  6. 微信小程序开发:页面分享卡片、风格选择、通道启用等可配置

    上文说到,我们部署了定时任务,但是有个地方忘记在上文写了,这里补上,就是定时任务的超时时间问题,超时时间有7200秒: 我们改成7100秒: 再把云函数调用的云对象的超时时间也改下: 超时时间多一点, ...

  7. 【Flink入门修炼】2-2 Flink State 状态

    什么是状态?状态有什么作用? 如果你来设计,对于一个流式服务,如何根据不断输入的数据计算呢? 又如何做故障恢复呢? 一.为什么要管理状态 流计算不像批计算,数据是持续流入的,而不是一个确定的数据集.在 ...

  8. B. Ela's Fitness and the Luxury Number

    思路: \[能想到平方是比较特殊的,因为x*x一定是x的倍数也就是说\sqrt[2]{x*x} = {x} \] \[所以需要考虑平法之间的数手模一下样例可以发现 [x^2 ,(x+1)^2)之间是x ...

  9. CPNtools协议建模安全分析--ML语言之颜色集定义(六)

    之前一直在怀疑我是不是因为对CPN Tools的原理结构还是不够理解,对Petri网的还没有弄清楚,越往后面看这种质疑越来越严重. 之前说CPN Tools在对称和非对称算法中不能形式化的问题,后续看 ...

  10. if (ctx.ifTo(ctx.property, next)) return

    if (ctx.ifTo(ctx.property, next)) return if (ctx.ifGoto(ctx.property, 'functionName')) return 试试 a & ...