我想在插入操作之后执行一个函数,该操作通过调用另一个函数来访问新插入的数据。这就是为什么我不能使用后插入触发器。因为,内部函数不使用":new"来访问数据。 有没有办法首先根据触发器进行插入,然后执行函数?
trigger insert_to_A after insert on tableX for each row
begin
insert into tableA values (function1(:new.field1));
end;
create or replace function function1(abc number) return number as
begin
select nvl(field1,-1)
into nMax1
from tableX
where field1= abc;
end;
因此,function1正试图访问其体内的tableX,我相信这就是问题所在。我希望能把它搞清楚。
答案 0 :(得分:0)
您是否收到类似“ORA-04091:表名正在变异”的错误?
在触发触发的同一个表中选择,插入或更新时会发生错误。
您可以通过COMPOUND TRIGGER
来避免此错误CREATE OR REPLACE TRIGGER insert_to_A
FOR insert on tableX
COMPOUND TRIGGER
AFTER STATEMENT IS
BEGIN
-- Put your function or statement
END AFTER STATEMENT;
BEFORE each ROW IS
BEGIN
-- Put your statement
END BEFORE each ROW;
END insert_to_A;
注意:您不能在“AFTER STATEMENT”主体中使用“:NEW”限制。
“AFTER STATEMENT”下的语句,您可以在tableX中选择,更新和插入。它会做1次声明。
“每个行前”下的语句,您无法在tableX中选择,更新和插入。每个受影响的行会做一次。
答案 1 :(得分:-1)
您可以创建一个在插入后仅触发一次的after语句触发器。问题是如何识别需要进一步处理的行(理论上这可能是多个记录)。
可能最简单的解决方案是在表格中添加一列,指示记录是否需要进一步处理。
否则,您可以在包中的集合中收集插入行的PK值,并在after语句触发器中使用该集合。您将需要:包含集合的包,用于将PK值放入集合的行级触发器,使用该集合的after语句触发器。