如何创建由更新触发的触发器,然后检查更新表中是否存在某些值,而另一个表是否仍为空。如果不是,则应将第三个表中的值更改为sysdate。
我的代码:
CREATE OR REPLACE TRIGGER TRG_UPDATE_VALUE
BEFORE UPDATE OF column1
ON table1
REFERENCING OLD AS OLD NEW AS NEW
for each row
DECLARE
value_one_null int;
value_two_null int;
BEGIN
SELECT COUNT(table1_id)
INTO value_one_null
FROM table1
WHERE column1 IS NULL
AND column2 = :NEW.column2;
SELECT COUNT(table2_id)
INTO value_two_null
FROM table2
WHERE column1 IS NULL
AND column2 = :NEW.column2;
IF (value_one_null = 0 AND value_two_null = 0)
THEN
UPDATE table3 SET table3.column1 = sysdate
WHERE table3_id = :NEW.column2;
END IF;
END;
编译触发器的工作原理。但是,如果我尝试更新表1,则会报错ORA-04091,ORA-06512,ORA-04088
我是PL / SQL的初学者,所以如果有人可以帮助我解决此错误,这将是惊人的。
主要问题是您试图从目标表(与该触发器相关联的表)中读取行级触发器中的行。RDMS禁止此操作。
实现该功能的一般方法是将程序包中的PL / SQl集合用作公用内存或使用COMPOUND触发器。
请阅读汤姆·凯特(Tom Kyte)的有关更改表和触发器的初始主题,以学习该主题。
这里是数百种解释之一: