在写trigger的时候,经常会遇到这种情况当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误:ORA-04091: table is mutating, trigger/function ma......
在写trigger的时候,经常会遇到这种情况 当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误: ORA-04091:
table is mutating, trigger/function may not see
it
关于这个错误,其实是由于对本表的操作造成的.ORACLE
DB里默认在写TRIGGER的时候把本表锁死,不允许对其进行操作,也就是说这个错误是不能通过系统的手段解决的,只能改用一些其它的SQL来绕开它. 刚接触TRIGGER的时候会经常犯这样的错误,其中有大部分是可以通过:new和:old来解决的,这是新手在写trigger时最需要注意的问题之一. 但是还会有一定要对本表进行修改或查询操作的情况,不能避免.
偶然的机会,发现了AUTONOMOUS_TRANSACTION,
AUTONOMOUS_TRANSACTION是指在function,procedure,trigger等subprograms中对事务进行自治管理,当在别的pl/sql
block里取调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit。
下面举例说明。
SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT
DATE);
表已创建。
SQL> CREATE OR REPLACE TRIGGER TR_T 2 AFTER
DELETE ON T 3 FOR EACH ROW 4 DECLARE V_COUNT
NUMBER; 5 --PRAGMA AUTONOMOUS_TRANSACTION; 6 BEGIN 7 INSERT
INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE); 8 COMMIT; 9 END
TR_DEL_CABLE; 10 /
触发器已创建
SQL> INSERT INTO T
VALUES(1,'111111',SYSDATE);
已创建 1 行。
SQL> INSERT INTO T
VALUES(2,'222222',SYSDATE);
已创建 1 行。
SQL>
COMMIT;
提交完成。
SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD
HH24:MI:SS') FROM T;
ID MC
TO_CHAR(DT,'YYYYM ---------- -------------------- -----------------
1 111111 20080802 11:07:36 2 222222
20080802 11:07:43
SQL> DELETE FROM T WHERE ID=1; DELETE FROM T
WHERE ID=1 * 第 1 行出现错误: ORA-04091: 表 TEST.T 发生了变化,
触发器/函数不能读它
1/2 1 2 下一页 尾页 |