-1

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

4

2 回答 2

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 条语句执行 1 次。

“BEFORE each ROW”下的语句,不能在tableX中选择、更新和插入。它将为每个受影响的行执行 1 次。

于 2015-11-05T15:00:45.567 回答
-1

您可以创建一个在插入后仅触发一次的 after 语句触发器。问题是如何识别需要进一步处理的行(理论上这可能不止一条记录)。

最简单的解决方案可能是在表中添加一个列,以指示记录是否需要进一步处理。

否则,您可以在包中的集合中收集插入行的 PK 值,并在 after 语句触发器中使用该集合。您将需要:一个带有集合的包,一个用于将 PK 值放入集合的行级触发器,一个使用该集合的语句后触发器。

于 2015-11-05T11:58:23.897 回答