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】卷轴特效

    1 原理 ​ 当一个圆在地面上沿直线匀速滚动时,圆上固定点的运动轨迹称为旋轮线(或摆线.圆滚线).本文实现的卷轴特效使用了旋轮线相关理论. ​ 以下是卷轴特效原理及公式推导,将屏幕坐标 (x) 映射到 ...

  2. 玩转C语言:深入理解输入输出函数的奥秘

    ​ 欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 单字符输出函数 在C语言中有一个函数putchar专门负责输出单个字符,其语法如 ...

  3. 2022年3月核心库MySQL优化总结

    2021年9月底到新公司,公司核心数据库,以前无专业DBA维护,问题多,隐患大,到2022年2月持续后,优化至今: 优化大项: 1,从1主3从,扩容到1主5从,将部分读放都另外新加从库   2,最大表 ...

  4. docker方式部署并使用gitlab

    工作中企业会在内网搭建一个公司内部使用的git环境,一般用的是gitlab. GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 下面介绍一 ...

  5. P1536 村村通(并查集)

    村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接 ...

  6. 如何配置WebStorm开发Chrome插件项目

    开发Chrome插件项目,在调用Chrome的相关接口时,默认情况下WebStorm是不会有任何提示的,这对于开发者特别是新手特别不友好. 因此,需要IDE能支持Chrome接口调用时的智能提示. 如 ...

  7. 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测cpu温度的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行(需要管理员权限):     国产麒麟操作上运 ...

  8. 工作中django的应用路径配置

    1.通常工作中都会把所有的应用放在一个主目录中 比如:主项目文件夹为luffyapi 在luffyapi下创建一个apps文件夹,用来存放所有的app应用 2.创建应用 先创建一个应用,需要cd到ap ...

  9. DataGear 自定义数据可视化看板的图表主题

    DataGear 看板的 dg-chart-theme 属性,提供了简单且强大的自定义图表主题功能. 通常,只需要设置其color.backgroundColor.actualBackgroundCo ...

  10. 微信小程序开发:接入阿里云人像动漫化api接口

    前面我已经把腾讯云的人像转动漫化接口接到了我的小程序里,但是和阿里云的对比后,发现阿里云的效果会更好一些,且支持更多特效,如下: 我比较喜欢这个3D特效风格,动画3D也可以,大家拭目以待. 话说上次接 ...