【发布时间】: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