ORA-04091 触发器/函数不能读

 

报错如下:

SQL> update GPPAYMENTFUND set attribute5='1' where fundapplyno ='20120314500102010001';
 
update GPPAYMENTFUND set attribute5='1' where fundapplyno ='20120314500102010001'
 
ORA-04091: 表 ACDEP.GPPAYMENTFUND 发生了变化,触发器/函数不能读
ORA-06512: 在"ACDEP.CLM_WEB_MAIN", line 4
ORA-04088: 触发器 'ACDEP.CLM_WEB_MAIN' 执行过程中出错

 

触发器如下:

CREATE OR REPLACE TRIGGER CLM_WEB_MAIN
before UPDATE
OF ATTRIBUTE5
ON ACDEP.GPPAYMENTFUND 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE v_id NUMBER;v_row_id VARCHAR2(30);v_change_type CHAR(1);
BEGIN
  IF UPDATING  THEN
        SELECT B.C_EDR_NO INTO v_row_id FROM acdep.GPPAYMENTFUND  A,acdep.T_FIN_CAVDOC B
            WHERE A.FUNDAPPLYNO=B.C_CAV_NO AND A.FUNDAPPLYNO=:NEW.FUNDAPPLYNO AND SUBSTR(B.C_EDR_NO,0,2)='03';
     IF(SUBSTR(v_row_id,0,4)='0330') THEN
        UPDATE WEB_CLM_MAIN@webclaim SET T_JQ_PAY_TM=TO_DATE (:NEW.ATTRIBUTE5,'yyyy-mm-dd hh24:mi:ss')
            WHERE T_CLAIM_NO=v_row_id and T_JQ_PAY_TM is null;
     ELSIF(SUBSTR(v_row_id,0,4)='0332') THEN
        UPDATE WEB_CLM_MAIN@webclaim SET T_SY_PAY_TM=TO_DATE (:NEW.ATTRIBUTE5,'yyyy-mm-dd hh24:mi:ss')
            WHERE B_CLAIM_NO=v_row_id and T_SY_PAY_TM is null;
     END IF;
  END IF;
 
END;

ORA-04091: "table %s.%s is mutating, trigger/function may not see it"
Cause: A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table.

if your trigger contains a select statement or an update statement referencing the table it is triggering off of you will receive the error.

 

这里应该是

SELECT B.C_EDR_NO INTO v_row_id FROM acdep.GPPAYMENTFUND  A,acdep.T_FIN_CAVDOC B
            WHERE A.FUNDAPPLYNO=B.C_CAV_NO AND A.FUNDAPPLYNO=:NEW.FUNDAPPLYNO AND SUBSTR(B.C_EDR_NO,0,2)='03';
不允许GPPAYMENTFUND 进行SELECT 因为它是触发器表

 

时间: 2024-09-20 22:21:59

ORA-04091 触发器/函数不能读的相关文章

解决触发器检测到活动的独立的事务处理, 已经回退、表发生了变化, 触发器/函数不能读它

   今天在写一个触发器的时候遇到一个问题,因为要用到新插入表中的数据进行查询,所以就遇到了一个问题: 解决办法是在DECLARE中加上一句话:PRAGMA AUTONOMOUS_TRANSACTION 但是这样又会遇到一个问题: 解决办法是在DML语句后面加上COMMIT 附上语句如下: CREATE OR REPLACE TRIGGER "TR_CMS_MEMBERINFO" AFTER INSERT OR UPDATE ON MEMBERNAME FOR EACH ROW   D

PostgreSQL 10.0 preview 功能增强 - 触发器函数内置中间表

标签 PostgreSQL , 10.0 , 触发器 , 中间表 , OLD , NEW 背景 在触发器中,如果要提取触发该事件的记录,使用OLD和NEW关键字. OLD.* , NEW.* 提取 对于for statement after触发器,触发的记录数可能是很多的,PostgreSQL 10.0增加了一个功能,中间表. 在触发器函数中,可以使用这个中间表,中间表的数据就是触发器涉及的数据,中级镖的功能支持after触发器(因为after后才有全部的记录呀). 语法 [ REFERENCI

Oracle触发器不能读取表的问题

问题描述 Oracle触发器不能读取表的问题 12.假设有这样一张用户表表结构如下:UserInfo(id ,username,userPass),希望向表中增加数据时,表中id列的数字自动生成.(选做) 1)第一步创建序列,要求开始的数字为1,每次递增1,按顺序产生序列值: 2)第二步创建一个触发器,向用户表中插入数据的时候触发触发器,在触发器内部调用序列并生成一个序列值赋值给表的id列. 触发器: create or replace trigger pro_id after insert o

oracle-ORACLE 触发器中 使用游标查询 本表 报错ORA-04091

问题描述 ORACLE 触发器中 使用游标查询 本表 报错ORA-04091 racle 触发器. 监听表A 更新 更新后触发. 其中 使用游标查询表A 数据. OPEN 游标时 会报 ORA-04091:表A发生了变化,触发器/函数不能读它 于是增加了自定义事物 pragma autonomous_transaction; 增加事物之后不报错了.但是OPEN 的游标 没有获取到任何数据. 想做到的效果是 是这样. 比如说表A里面有4条数据 1 aaaa 2 bbbb 3 cccc 4 dddd

ORA-04091: table xxxx is mutating, trigger/function may not see it

今天同事让我看一个 触发器为什么老是报错,当执行DML语句触发触发器后,会报ORA-04091错误:ORA-04091: table xxxx is mutating, trigger/function may not see it .对应的中文错误提示为:ORA-04091: 表 xxx发生了变化, 触发器/函数不能读它. 原因分析: [oracle@DB-Server ~]$ oerr ora 4091 04091, 00000, "table %s.%s is mutating, trig

ORACLE错误一览表 方便查询_oracle

ORACLE错误一览表,方便大家查询! ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程:无法转换会话 ORA-00022: 无效的会话 ID:访问被拒绝 ORA-00023: 会话引用进程私用内存:无法分离会话 ORA-00024: 单一进程模式下不允许从多个进程注册 ORA-000

Oracle变异表解决方法--ORA-04091错误

Oracle变异表解决方法--ORA-04091错误 原因:触发器(或者被语句中引用的用户自定义PL/SQL函数)视图去查询(或修改)一个被另一语句修改而触发的表. 解决方法:重写触发器(或函数)避免读该表. 对表进行DELETE,UPDATE,INSERT操作时,所操作的表就变成了变异表,对表的行级(FOR EACH ROW)触发器中不能对该表进行DML操作.这时可以使用两个方法解决. [@more@] 1.采用自治事务pragma autonomous_transaction解决. 下面给出

一天学会PostgreSQL应用开发与管理 - 7 函数、存储过程和触发器

本章大纲 一.运算符与函数 1 逻辑运算 2 比较运算 3 算数 4 字符串 5 bytea 6 bit 7 规则表达式 8 日期.数字.字符串格式化输出 9 时间 10 枚举 11 几何 12 网络地址 13 全文检索 14 XML 15 JSON.JSONB 16 序列 17 条件表达式 18 数组 19 范围 20 聚合 21 窗口 22 子查询表达式 23 行与数组表达式 24 返回集合的函数 25 系统信息函数 26 系统管理函数 二.过程语言 1 语法 2 plpgsql函数内部结构

pthread_rwlock_t读写锁函数说明

转:http://www.cnblogs.com/renxinyuan/p/3875659.html 索引:  初始化一个读写锁pthread_rwlock_init 读锁定读写锁      pthread_rwlock_rdlock 非阻塞读锁定 pthread_rwlock_tryrdlock 写锁定读写锁      pthread_rwlock_wrlock 非阻塞写锁定      pthread_rwlock_trywrlock 解锁读写锁         pthread_rwlock_