我有这样的触发器:
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:表名发生变异,触发/功能可能看不到它
我没有更新订单表中的任何行,所以有什么解决方法吗? 我只需要选择代表新记录的父级的行类型,并在更新另一个表时使用该值。
答案 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;
此致