ORA-04091:表名是变异的,触发器/函数可能看不到它

时间:2016-04-11 18:31:37

标签: sql oracle plsql

我有这样的触发器:

CREATE OR REPLACE TRIGGER orders_after_insert
AFTER INSERT
   ON orders
   FOR EACH ROW

DECLARE
   v_type number;

BEGIN
   SELECT type
   INTO v_type
   FROM orders
   WHERE id = :new.parent_id;

   -- do sth with v_type
END;

我收到如下错误消息:

  

ORA-04091:表名发生变异,触发/功能可能看不到它

我没有更新订单表中的任何行,所以有什么解决方法吗? 我只需要选择代表新记录的父级的行类型,并在更新另一个表时使用该值。

1 个答案:

答案 0 :(得分:0)

你应该使用PRAGMA_AUTONOMOUS_TRANSACTION来检索另一个会话中的类型列而不会出现错误ora-04091:

创建一个这样的函数:

CREATE OR REPLACE FUNCTION SF_GETTYPE (pParent_id NUMBER) RETURN NUMBER
IS
    pragma autonomous_transaction;
    v_type number;          
BEGIN
    SELECT type
    INTO v_type
    FROM orders
    WHERE id = pParent_id;

    RETURN v_type;
END;

修改触发器以使用功能SF_GETTYPE:

CREATE OR REPLACE TRIGGER orders_after_insert
AFTER INSERT
   ON orders
   FOR EACH ROW

DECLARE
   v_type number;

BEGIN
   v_type := SF_GETTYPE(:new.parent_id);
   -- do sth with v_type
END;    

此致