需求是当一条记录的一个字段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;
试试这个 应该没问题 注意复制时候里面的中文字符空格