【问题标题】:BEFORE TRIGGER causes ORA-04091在触发之前导致 ORA-04091
【发布时间】:2020-02-21 01:01:42
【问题描述】:

我刚开始使用 SQL 并遇到一个问题:我想编写一个更新前触发器,但是当我尝试更新表时,我总是得到那个错误 (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;



【问题讨论】:

  • 呃。 . .为什么叫SHIPDATE 的东西存储在字符串中?该列应为datetimestamp

标签: sql oracle triggers sql-update ora-04091


【解决方案1】:

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

但在您的用例中,您似乎不需要查询表。如果要访问即将更新的记录上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;

【讨论】:

  • 如果他需要数点东西怎么办?我有这个问题,因为我应该先比较新的 id 并计算一些东西。例如,如果计数 >2,则不应执行更新。
猜你喜欢
  • 2011-11-18
  • 1970-01-01
  • 2018-11-30
  • 2013-05-13
  • 2012-05-17
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多