触发前导致 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;
我刚开始使用 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;