我有一个库存的表,有库位,优先级,和名称之类的列,库位能表示上层和下层,我想做一个触发器,在有上层货物到时,将下层的货物优先级修改小一些,我写了一个总是出错,请问高手怎么解决?CREATE OR REPLACE TRIGGER PROVIEW.TRI_COILS2
AFTER INSERT OR UPDATE
ON PROVIEW.COILS1
FOR EACH ROW
DECLARE
V_NUM1   NUMBER(2);
V_NUM2   NUMBER(2);
V_VAR1   VARCHAR(4);
V_NUM3   NUMBER(4);
BEGIN
     IF UPDATING THEN
       BEGIN
       V_NUM2 := TO_NUMBER(SUBSTR(:NEW.UF3,3,2));
   V_NUM1 := TO_NUMBER(SUBSTR(:NEW.UF3,1,2));
   V_NUM3 := TO_NUMBER(SUBSTR(:NEW.UF3,1,4));
   V_VAR1 := TO_CHAR((V_NUM3-20));
       IF ((V_NUM1>=1 AND V_NUM1<=23) AND (V_NUM2>=21 AND V_NUM2<=32) AND:NEW.FLAG = 119 ) THEN
      UPDATE COILS1 SET PRIORITY = 0 WHERE UF3 = V_VAR1 AND FLAG = 119;
       END IF;
    END;
     END IF;END;

解决方案 »

  1.   

    AUTONOMOUS TRANSACTION
    可以搜下自治事务。如果使用自治事务,事务的末尾要commit
    但这样也会造成一个问题,例如:你往COILS1表中插入一条记录,触发了触发器
    此时,自治事务里是看不到这条记录的,因为该记录尚未提交,而自治事务和当前事务属于两个事务
    再者,你在自治事务里提交,触发器中的更改即已生效。此时如果你的当前事务没有提交,而是回滚,自治事务中的却不会回滚。可能会造成数据不一致所以需要权衡一下。触发器并不建议使用