触发器有问题么?

Broadsea 2001-11-28 11:52:04
CREATE OR REPLACE TRIGGER "S-DEW"."STORYCANDIDACY_UPDATE" AFTER
UPDATE OF GRADE_CHENC, GRADE_ANNIE, GRADE_LIXH, GRADE_NINGCS
ON "S-DEW"."STORYCANDIDACY"
FOR EACH ROW
BEGIN
UPDATE STORYCANDIDACY
SET STORYCANDIDACY.GRADE_SUM = (:NEW.GRADE_CHENC + :NEW.GRADE_ANNIE + :NEW.GRADE_LIXH + :NEW.GRADE_NINGCS)
WHERE (STORYCANDIDACY.STORYID = :NEW.STORYID);
END;

触发器已创建

UPDATE STORYCANDIDACY SET GRADE_CHENC = GRADE_CHENC+0
*
ERROR 位于第 1 行:
ORA-04091: 表 S-DEW.STORYCANDIDACY 发生了变化,触发器/函数不能读
ORA-06512: 在"S-DEW.STORYCANDIDACY_UPDATE", line 2
ORA-04088: 触发器 'S-DEW.STORYCANDIDACY_UPDATE' 执行过程中出错
...全文
87 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Broadsea 2001-11-28
  • 打赏
  • 举报
回复
KingSunSha(弱水三千),給留个QQ么?
broadsea@peoplemail.com.cn
Broadsea 2001-11-28
  • 打赏
  • 举报
回复
上面的“BEFOR”少了个“E”,好像成了!
Broadsea 2001-11-28
  • 打赏
  • 举报
回复
改成你说的那样,却出上面的错误!

我的想法是,一个表的某些字段的值发生了变化,则自动改变另几个字段的值!

在MSSQL中我实现得很好的!
KingSunSha 2001-11-28
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER "S-DEW"."STORYCANDIDACY_UPDATE"
BEFOR UPDATE OF GRADE_CHENC, GRADE_ANNIE, GRADE_LIXH, GRADE_NINGCS
ON "S-DEW"."STORYCANDIDACY"
FOR EACH ROW
BEGIN
:NEW.GRADE_SUM := :NEW.GRADE_CHENC + :NEW.GRADE_ANNIE + :NEW.GRADE_LIXH + :NEW.GRADE_NINGCS;
END;
Broadsea 2001-11-28
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER "S-DEW"."STORYCANDIDACY_UPDATE" AFTER
UPDATE OF GRADE_CHENC, GRADE_ANNIE, GRADE_LIXH, GRADE_NINGCS
ON "S-DEW"."STORYCANDIDACY"
FOR EACH ROW
BEGIN
:NEW.GRADE_SUM := :NEW.GRADE_CHENC + :NEW.GRADE_ANNIE + :NEW.GRADE_LIXH + :NEW.GRADE_NINGCS;
END;

ERROR 位于第 1 行:
ORA-04084: 无法更改此触发器类型的 NEW 值
KingSunSha 2001-11-28
  • 打赏
  • 举报
回复
:NEW.GRADE_SUM =
to
:NEW.GRADE_SUM :=
Broadsea 2001-11-28
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER "S-DEW"."STORYCANDIDACY_UPDATE" AFTER
UPDATE OF GRADE_CHENC, GRADE_ANNIE, GRADE_LIXH, GRADE_NINGCS
ON "S-DEW"."STORYCANDIDACY"
FOR EACH ROW
BEGIN
:NEW.GRADE_SUM = :NEW.GRADE_CHENC+:NEW.GRADE_ANNIE+:NEW.GRADE_LIXH+:NEW.GRADE_NINGCS;
END;

警告: 创建的触发器带有编译错误。
KingSunSha 2001-11-28
  • 打赏
  • 举报
回复
在触发器中不能对本表进行操作,否则或引起死循环的.
如果你的表中STORYID是主键的话,不要用UPDATE语句
UPDATE STORYCANDIDACY
SET STORYCANDIDACY.GRADE_SUM = (:NEW.GRADE_CHENC + :NEW.GRADE_ANNIE + :NEW.GRADE_LIXH + :NEW.GRADE_NINGCS)
WHERE (STORYCANDIDACY.STORYID = :NEW.STORYID);

改成为: :NEW.GRADE_SUM := :NEW.GRADE_CHENC + :NEW.GRADE_ANNIE + :NEW.GRADE_LIXH + :NEW.GRADE_NINGCS;

应该达到你的要求了吧?
Free_Man 2001-11-28
  • 打赏
  • 举报
回复
这还用说,你这不是要作个死循环吗.

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧