日期:2014-05-17 浏览次数:21001 次
CREATE OR REPLACE TRIGGER AIUFER_FOO
  BEFORE INSERT OR UPDATE
  ON FOO
FOR EACH ROW  
BEGIN
  IF :NEW.A = 1 THEN
    SELECT SYSDATE INTO :NEW.B FROM DUAL;
  END IF;
END;
------解决方案--------------------
变异表的问题,这种情况,需要用自治事务。
CREATE OR REPLACE TRIGGER AIUFER_FOO
 BEFORE INSERT OR UPDATE
 ON FOO
FOR EACH ROW 
DECLARE
 PRAGMA AUTONOMOUS_TRANSACTION;
 FOO_COUNT INT;
BEGIN
 SELECT COUNT(*) INTO FOO_COUNT FROM FOO 
 WHERE :NEW.A=1;
 IF FOO_COUNT>0 THEN
 :NEW.B:=SYSDATE;
 END IF;
END;
------解决方案--------------------
在触发器中一般不能查询基表,虽然自治事务可以,但容易造成死锁问题
所以尽不要使用这种方案,象这种问题,使用前端控制或者通
过存储过程控制!
触发器和自治事务不要滥用。
------解决方案--------------------
用after触发器
------解决方案--------------------
SELECT COUNT(*) INTO FOO_COUNT FROM FOO 
 WHERE :NEW.A=1;
 IF FOO_COUNT>0 THEN
 :NEW.B:=SYSDATE;
 END IF;
改为   if NEW.A=1 then  
      :NEW.B:=SYSDATE;
      END IF;
------解决方案--------------------
至于改为after后 因为此时值已经提交了 
所以你不能在修改 :NEW.B 的值了
------解决方案--------------------