触发器不能读它的问题

摘要:
http://space.itpub.net/7728585/viewspace-718992报错如下:SQL˃updateGPPAYMENTFUNDsetattribute5='1'wherefundapplyno='20120314500102010001';updateGPPAYMENTFUNDsetattribute5='1'wherefundapplyno='20120314500102

http://space.itpub.net/7728585/viewspace-718992

报错如下:

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
UPDATESET 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
UPDATESET 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 因为它是触发器表

免责声明:文章转载自《触发器不能读它的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# DateTime.ToString()的各种日期格式如何比较版本号--Python实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何使用Navicat for SQLite 触发器

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。Navicat for SQLite 触发器当指定的数据库事件发生时自动运行数...

易失性存储器SRAM基础知识

存储器概况存储器是计算机系统中的记忆设备,主要是用来存放程序和数据。存储器按存储特性可分为非易失和易失两大类。目前常见的多为半导体存储器。 非易失性存储器非易失存储器是指在系统停止供电的时候仍然可以保持数据。常见的设备如电脑硬盘、TF卡、SD卡、U盘等。 易失性存储器易失存储器是指在系统停止供电的时候数据丢失。常见的设备如电脑内存、高速缓存、显示器显存等。...

hiveql函数笔记(二)

1、数据查询 //提高聚合的性能 SET hive.map.aggr=true; SELECT count(*),avg(salary) FROM employees; //木匾不允许在一个查询语句中使用多于一个的函数(DISTINCT。。。)表达式 SELECT count(DISTINCT symbol) FROM stocks; 表生成函数: exp...

Oracle触发器详解

开发中肯定会用到Oracle的触发器,本文进行详细讲解。 这里实例中用到的主要是Oracle中scott用户下的emp以及dept表,数据如下 一、触发器概念 1、概念: 触发器的本质是一个存储过程,顾名思义发生特定事件时Oracle会执行触发器中的代码。 细分它的组成可以分为3个部分:第一部分在什么条件下触发器会执行,即触发器被触发的事件。第二部分在什...

shell 字符串分割

语法1: substring=${string:start:len}   string的下标从0开始,以start可是,截取len个字符,并赋值于substring 1 #!/bin/bash 2 #substr=${string:start:len} 3 str="123456789" 4 substr=${str:3:3} 5 echo $su...

Unity3D使用碰撞体做触发器实现简单的自己主动开门

 在游戏制作中触发器的使用很的方便也很有用。 这一张我们简介一下怎样使用一个简单的触发器来实现自己主动开门关门的效果。 首先确保你已经对门进行了动画的设置。 详细流程例如以下。 选择Window->Animation打开动画窗体,选中须要加入动画的门之后点击红色button创建新动画。 选中一个须要加入动画的要素之后(比方Postion...