在旧=新上进行选择时获取突变表(ORA-04091)



我在oracle中对触发器进行简单的选择计数时遇到问题。我一直收到ORA-040091:

AFTER INSERT OR UPDATE ON table
FOR EACH ROW
DECLARE
legal_amount INT;
BEGIN
SELECT count(*)
INTO legal_amount 
FROM table 
WHERE :old.TBL_ID = :new.TBL_ID; /* Many more AND clauses here */
IF (legal_amount = 0) THEN
no_legal_amount_procedure(:new.TBL_ID);
END IF;
ELSE
legal_amount_procedure(:new.TBL_ID);
END IF;
END;

正是select语句导致了ORA-04091错误。

我们以前解决这个问题的方法是进行PRAGMA AUTONOMOUSE_TRANSACTION,但我需要消除它,因为它会导致其他问题(在自主事务中选择与旧事务中所需的未限制数据=空结果)。

我也尝试过遵循这里的asktom教程,但没有成功,因为AND子句的数量太多,而且这是一个FOR EACH ROW语句。我希望这将是最后的手段。

我知道在触发器中做业务逻辑是不好的。但如果不能访问源代码,这是解决问题的唯一方法

用存储过程包装整个插入,而不是触发器。这是一个仅用于INSERT的示例:

CREATE OR REPLACE PROCEDURE insert_table (in_tbl_id INTEGER, ...[other attrs])
IS
v_legal_amount INTEGER;
BEGIN
SELECT count(*)
INTO v_legal_amount 
FROM table 
WHERE tbl_id = in_tbl_id
/* Many more AND clauses here */;
INSERT INTO table VALUES (tbl_id, ...);
IF (v_legal_amount = 0) THEN
no_legal_amount_procedure (in_tbl_id);
ELSE
legal_amount_procedure (in_tbl_id);
END IF;
END;

最新更新