我写的一个触发器,
if inserting then
if :new.pk_house IN ('C0107','C0102') then
UPDATE "MES"."INVT"
SET "DISP_QTY" = NVL(DISP_QTY,0) - to_number(:new.inout_flag) *:new.plan_qty + to_number(:new.inout_flag) *:new.real_qty ,
"TS" = SYSDATE
WHERE ( MES."INVT"."HOUSE" = :new.pk_house ) AND
( MES."INVT"."ITEM" = :new.item_no ) AND
( MES."INVT"."BATCH"= :new.batch) ;
end if;
end if;
实际应用的时候偶尔会发生update不成功的情况,可能是什么原因?基本几个月会出现那么一两次。
顺道问一下plsql在调试触发器的时候怎么变量监视器里面显示不了这种:new.house 的值?
一、监视不了有很多种方式可以绕过去。
二、查问题的话,从你这个sql里看,如果INVT这个表里本就没有记录,当然更新是更新不到的;还有如果where条件里的6个值,有任何一个值为空,也是查不到的,再就是你更新的值,如果有某个值为空,做四则运算的结果也是会为空。
还有,要注意并发的情况,如果是两个会话同时执行这个表的插入,你前面又没判断锁,是有可能出现某条更新的结果被覆盖的情况。
三、另外,如果数据很难跟踪的话,你完全可以再加个日志表,每插一笔,就把用到的这些值都记录到日志表里去,当你发现数据对不上的时候,回头去查日志表,是不是有数据为空的情况。