触发前导致 ORA-04091

BEFORE TRIGGER causes ORA-04091

我刚开始使用 SQL 并且有一个问题:我想写一个更新前触发器但是当我尝试更新 Table 时我总是得到那个错误 (ORA-04091)。我真的不明白为什么;因为我认为之前的更新触发器对变异表没有问题。

 BEFORE UPDATE ON ORD
 FOR EACH ROW
 DECLARE
 shipping2 varchar(10);
 BEGIN
 SELECT SHIPDATE into shipping2 
 FROM ORD 
 WHERE ORDID = :old.ORDID;

 IF (shipping2 is not NULL) then
    raise_application_error(20121,'ORDER already on the way!!!');
 end if;

 END;
-------------------------------------------------------

UPDATE ORD
SET TOTAL = 222
WHERE ORDID = 603;



此错误表明您无法在触发器本身内查询触发触发器的 table。

但在您的用例中,您似乎不需要查询 table。如果要访问即将更新的记录上列 SHIPDATE 的当前值,只需使用 :OLD.SHIPDATE.

所以像这样:

BEFORE UPDATE ON ORD
FOR EACH ROW
BEGIN
    IF (:old.SHIPDATE IS NOT NULL) THEN
        RAISE_APPLICATION_ERROR(20121,'ORDER already on the way!!!');
    END IF;

END;