插入后执行的函数

时间:2015-11-05 11:08:31

标签: oracle function plsql triggers insertafter

我想在插入操作之后执行一个函数,该操作通过调用另一个函数来访问新插入的数据。这就是为什么我不能使用后插入触发器。因为,内部函数不使用":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,我相信这就是问题所在。我希望能把它搞清楚。

2 个答案:

答案 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语句触发器。