Welcome 微信登录

首页 / 数据库 / MySQL / ORA-04091:触发器/函数不能读

关于自治事务解决触发器导致"ORA-04091:触发器/函数不能读它"不可行的验证。经常会有人提出这样的问题:“有一个这样的问题,有一个表A有 a,b,c,d四个字段,修改一条记录d的值为2的倍数,希望把该记录插入相同结构的表B中。并删除A表的这条记录。”相关SQL:--一张表create table FOO

  A NUMBER(10),
  B NUMBER(10),
  C NUMBER(10),
  D NUMBER(10)

;--基于这张表的触发器CREATE OR REPLACE TRIGGER tri_foo
AFTER INSERT OR UPDATE ON foo
FOR EACH ROW
DECLARE
  N_NUM NUMBER(5);
BEGIN
  IF MOD(TRUNC(:NEW.D),2) =0 THEN
      DELETE FROM FOO WHERE FOO.D = :NEW.D;
  END IF;
END;这个函数在执行的时候会报告这样的错误:“ORA-04091:表SCOTT.FOO 发生了变化,触发器/函数不能读它”。网上有很多关于该错误的解决方案,其中,有很大一部分是增加PRAGMA AUTONOMOUS_TRANSACTION语句,设置该触发器为自治事务,然后避免该错误。增加之后确实不报错了,而且貌似可以执行了,但是事真的如此么?修改之后的触发器如下:CREATE OR REPLACE TRIGGER tri_foo
AFTER INSERT OR UPDATE ON foo
FOR EACH ROW
DECLARE
 PRAGMA AUTONOMOUS_TRANSACTION;
  N_NUM NUMBER(5);
BEGIN
  IF MOD(TRUNC(:NEW.D),2) =0 THEN
      DELETE FROM FOO WHERE FOO.D = :NEW.D;
  END IF;
  COMMIT;
END;
  • 1
  • 2
  • 下一页
PL/SQL中集合出现“ORA-06533:下表超出数量”的问题解决PL/SQL的BOOLEAN的三个值:TRUE,FALSE,NULL相关资讯      Oracle错误代码  ORA-04091 
  • Oracle错误代码大全  (02/16/2015 21:31:57)
  • ORA-04091和Compound Trigger(  (12/14/2013 19:29:56)
  • 关于ORA-04091异常的出现原因,以  (07/08/2013 14:04:40)
  • Oracle中变异表(ORA-04091)处理方  (01/21/2014 14:01:40)
  • Oracle变异表触发器中ORA-04091错  (11/25/2013 10:26:56)
  • Oracle触发器给表自身的字段重新赋  (07/08/2013 13:57:10)
本文评论 查看全部评论 (0)
表情: 姓名: 字数