我有一个日期列为ZM的表格DWZ,需要在日期小于同一张表中的DZZ日期时设置触发器。
猜猜我的代码有错误,因为我在尝试更改DWZ日期时得到“ORA-04091:表TOMEK.ZM正在变异,触发/功能可能看不到它”。
请帮我纠正
CREATE OR REPLACE TRIGGER SDW
BEFORE UPDATE OF DWZ
ON ZM
FOR EACH ROW
DECLARE
minimum DATE;
BEGIN
SELECT DZZ INTO minimum
FROM ZM z
WHERE z.DWZ = :NEW.DWZ;
IF :NEW.DWZ <= minimum THEN
Raise_application_error(-20201,'Date=' ||:NEW.DWZ|| ' is wrong');
END IF;
END;
答案 0 :(得分:1)
由于您只想比较同一行中两列之间的数据,因此只需使用:new
伪记录即可。无需查询表
CREATE OR REPLACE TRIGGER SDW
BEFORE UPDATE OF DWZ
ON ZM
FOR EACH ROW
BEGIN
IF :NEW.DWZ <= :new.dzz THEN
Raise_application_error(-20201,'Date=' ||:NEW.DWZ|| ' is wrong');
END IF;
END;
当然,在现实世界中,你永远不会使用触发器来做这类事情。你会使用检查约束。