触发器语法问题

需求是当一条记录的一个字段A更新时,这行记录的字段b需要赋值给字段c。报错:ORA-24344: success with compilation error

代码如下:

CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

AFTER UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF :NEW.FXS_BGZT = 'YBG' THEN

:NEW.FXS_BGPFL=:NEW.FXS_BGSQL;

End if;

End;

为何一定要用触发器???触发器那一行出错了,

两个问题我都没法回答你,用触发器是因为只能通过数据库层面实现,这个报错没有提示哪一行。

下午我帮你写


你的是mysql还是oracle?

oralce

CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

AFTER UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF (:NEW.FXS_BGZT = 'YBG')

THEN

update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where 主键=:old.主键;

End if;

End;

这种方式,试过了吗。我本地没oracle,不方便测试

我试试


创建成功了 但是更新表的时候出错了

[Err] ORA-04091: table HBCRM.GAS_RJH_FXS is mutating, trigger/function may not see it

ORA-06512: at "HBCRM.GAS_RJH_FXS_UPPER", line 7

ORA-04088: error during execution of trigger 'HBCRM.GAS_RJH_FXS_UPPER'

at "HBCRM.GAS_RJH_FXS_UPPER", line 7

这块报错,是啥

这张表有没有定义其他的触发器

没有定义其他的触发器


第七行是update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where GAS_RJH_FXS_ID=:old.GAS_RJH_FXS_ID;



select trigger_name from user_triggers where table_name='GAS_RJH_FXS';

查一下

update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where 主键=:now.主键;

你改成这个试试




我只是把您给的now.主键改成了 new.主键 其他都一样

错误和之前一样


是,是new,写错了

这么尴尬吗

那你数据直接写死吧。看看

验证是不是update语句问题,在这张表中随便插入几个字段

CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

AFTER UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF (:NEW.FXS_BGZT = 'YBG')

THEN

insert into GAS_RJH_FXS 。。。。

End if;

End;

CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

BEFORE UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF (:NEW.FXS_BGZT = 'YBG')

THEN

update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where 主键=:new.主键;

End if;

End;

绝望了。。。


为什么总是提示那个错误,那还是触发器定义有问题吧

应该是


CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

BEFORE UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF (:NEW.FXS_BGZT = 'YBG')

THEN

update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where 主键=:new.主键;

End if;

End;

这个试了吗,用前置触发器

一样的错误

是不是这种需求触发器就做不了


触发器不能对本表更新进行触发,不然会产生触发死循环,哪怕逻辑上不会死循环,你可以思考一下,每更新一次都会触发,每次触发又都会更新,如果你非要实现这个操作不如把表复制一份,表a改变了就触发改变b表b,表b改变继而触发改变表a这样达到了a更新的地步

想了一下,你这个真不用触发器。

你的需求就是分两步实现的

第一,修改记录中的字段。

判断是否修改成功

第二,再将修改的那条记录中的某个字段值赋值给另一个字段

触发器好像是不能对自身表触发。

之所以用触发器的原因是 这个操作是手机端和pc端都有 手机端现在没法控制 只能通过数据库层面控制


手机端和pc端不同。。。

CREATE OR REPLACE TRIGGER GAS_RJH_FXS_UPPER

BEFORE UPDATE OF FXS_BGZT ON GAS_RJH_FXS

FOR EACH ROW

BEGIN

IF (:NEW.FXS_BGZT = 'YBG')

THEN

update GAS_RJH_FXS set FXS_BGZT=:NEW.FXS_BGSQL where 主键=:new.主键;

End if;

End;
试试这个 应该没问题 注意复制时候里面的中文字符空格