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】Unity3D技术栈

    1 前言 ​ 本文梳理了笔者在学习 Unity3D 的过程中,对 Unity3D 的理解和学习路线,以帮助读者循序渐进地学习 Unity3D,后续笔者仍会持续更新 Unity3D 相关技术栈,并同步到 ...

  2. Java8函数式接口Predicate实战

    关于函数式接口 函数式接口 Funcational Interface 是指接口范围内只允许有一个抽象方法(不包括default和static方法)的接口.Java中有一些预定义的函数接口,如Pred ...

  3. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  4. JavaScript的引入并执行-包含动态引入与静态引入

    JavaScript的引入并执行-包含动态引入与静态引入 JavaScript引入方式 html文件需要引入JavaScript代码,才能在页面里使用JavaScript代码. 静态引入 行内式 直接 ...

  5. python装饰器保留原有函数名称和属性functools.wraps()

    # python装饰器在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,python的functools包中提供了一个叫wraps的decorator来消 ...

  6. pexpect模块(替代subprocess)

    https://blog.csdn.net/pcn01/article/details/104993742/

  7. 启动Study.BlazorOne项目

    由于Study.Trade模块的Blazor是基于国内著名的BootstrapBlazor组件,因此Study.BlazorOne项目也必须添加对BootstrapBlazor的支持. # 1.去Bo ...

  8. 【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)

    问题描述 在本地调试Azure Function时,遇见了跨域问题: Access to XMLHttpRequest at 'http://localhost:7071/api/HttpTrigge ...

  9. Java-- Arrays操纵数组的工具类

    1 //操作数组的工具类 java.util.Arrays :操作数组的工具类 里面定义了很多操作数组的方法 2 public static void main(String[] args) 3 { ...

  10. python 字典列表,元组列表 列表嵌套字典 列表嵌套元组 字典嵌套列表

    列表嵌套字典 l=[] for i in alist: kk = {} names.append(i.string) a_url.append(i.get('href')) kk['章节名']=i.s ...