【问题标题】:mutating, trigger/function may not see it- error during execution of trigger变异,触发器/函数可能看不到它 - 执行触发器期间出错
【发布时间】:2011-03-01 02:50:23
【问题描述】:
CREATE OR REPLACE TRIGGER UPDATE_TEST_280510
AFTER insert on TEST_TRNCOMPVISIT
declare
V_TRNCOMPNO NUMBER(10);

CURSOR C1 IS SELECT B.COMPNO FROM TEST_TRNCOMPVISIT A, TEST_TRNCOMPMST B, 
                                  TEST_MEMMAST C
WHERE A.COMPNO=B.COMPNO 
AND B.TRNMEMID=C.MEMID 
AND C.MEMOS>=1000;

begin
open c1;
fetch c1 into V_TRNCOMPNO;


UPDATE TEST_TRNCOMPMST SET COMPSTATUS='P',
       remark='comp is pending due to O/S>1000'
WHERE COMPNO=V_TRNCOMPNO AND COMPSTATUS='C';
CLOSE C1;

end;

我已经做了这个触发器,当在表中插入行时-TEST_TRNCOMPVISIT 它给出了以下错误-

出现以下错误:

ORA-04091:表 TEST.TEST_TRNCOMPVISIT 正在变异,触发器/函数可能看不到它
ORA-06512:在“TEST.UPDATE_TEST_280510”,第 4 行
ORA-06512:在“TEST.UPDATE_TEST_280510”,第 10 行
ORA-04088: 执行触发器 'TEST.UPDATE_TEST_280510' 期间出错

【问题讨论】:

  • 当您尝试访问 FOR EACH ROW 触发器中触发器所基于的表时会发生该错误。你确定你没有在你的触发器定义中加入 FOR EACH ROW 吗?
  • 尊敬的 Tony 先生,删除 FOR EACH ROW 后,没有发生错误,但记录没有按照触发器正文中的指定更新。请使用建议。马赫什A....
  • 触发器应该做什么?如果游标 c1 返回一行,它似乎会更新一些行。
  • 如果游标 c1 返回一行,此触发器将更新表 TEST_TRNCOMPMST 的 COMPSTATUS & REMARK 列。但即使在 c1 返回一行后它也不会更新。请建议。马赫什...
  • 另请注意,您的触发器只进行一次提取,因此如果游标返回多条记录,则仅更新第一条记录。

标签: sql oracle oracle9i ora-04091 ora-04088


【解决方案1】:

这是你唯一的触发器吗? 您的触发器更新表 TEST_TRNCOMPMST。如果此表上有访问 TEST_TRNCOMPVISIT 的触发器,则会收到错误消息。

【讨论】:

  • 是的,先生,这是我唯一的触发器。表 TEST_TRNCOMPMST 上没有另一个触发器。我应该做什么来更新表 TEST_TRNCOMPMST,每当记录插入表 TEST_TRNCOMPVISIT 时,表 TEST_TRNCOMPMST 中有 compno。请帮帮我,因为我是ORACLE的新手,我在这个领域没有任何工作经验,距离我完成学业只有2个月。马赫什...
【解决方案2】:

当定义为 FOR EACH ROW 的触发器尝试访问被触发的表时,会引发“表正在变异”异常。 Tom Kyte 写了一个很好的指南来解释这个异常的原因和解决方法here

在您发布的示例中,您没有 FOR EACH ROW,因此我不希望引发异常。通常,只有在需要访问每一行的 :OLD 或 :NEW 值时才需要使用 FOR EACH ROW 触发器,而您不需要。

【讨论】:

  • 对不起。我忘了在给定的例子中输入它。从触发器定义中删除它后,错误没有发生,但记录也没有按照触发器正文中的指定更新。请建议。马赫什...
  • 我的第一个建议是您在触发器中放置一些调试消息,例如使用 DBMS_OUTPUT.PUT_LINE 来验证 (a) 它是否正在执行,以及 (b) 游标是否正在查找任何行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2016-04-29
相关资源
最近更新 更多