日期:2014-05-17 浏览次数:20875 次
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 的值了
------解决方案--------------------