Oracle 插入后执行的函数

Oracle 插入后执行的函数,oracle,function,plsql,triggers,insertafter,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

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

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

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

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

您是否收到类似“ORA-04091:表名正在变化”这样的错误

在触发触发器的同一个表中选择、插入或更新时,将发生错误

您可以通过以下方法避免此错误:

注意:您不能使用:NEW“in”AFTER STATEMENT“body”作为限制

在“AFTER STATEMENT”下,您可以选择、更新和插入tableX中的语句。它将为1个语句执行1次


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

请详细说明。不清楚你的确切要求是什么。是否要让插入的行以不同的方式进行处理?如果是,您可以使用
返回到
子句。看看这里的一个例子,我不认为这与我试图以任何方式解释的内容有关。我想在插入操作之后执行一个函数。但我希望插入操作和触发器不会以原子方式执行。我希望先执行insert操作,这样我就可以在表的新状态(插入新行)上运行函数,而无需使用“:new”关键字。我希望这能让它更清楚一点,也许举个例子会更好。如果您可以编辑您的问题并添加测试用例。我仍然对您的流程感到困惑。桌上已经有触发器在做什么了吗?这些函数将做什么?为什么不使用:new?另外,您不能创建一个简单的测试用例来演示您正在尝试做什么吗?(例如,创建表和插入语句,以及您要查找的结果)。这样,我们就有更好的机会a)了解您的目标,b)帮助您实现目标。目前,这一切都有点“我有这个东西,我想做另一件事,我希望它最终像这样{waves hands}”;几乎不可能破译,因为我们没有与您坐在一起,也看不到您肩上的屏幕。因此,只有在
表x上的插入完成后,您才想执行
函数1
?我根本不需要识别特定行。我只需要对表的所有行(包括新插入的行)执行一个操作。如何创建插入后只触发一次的after语句触发器?究竟为什么在插入后需要对整个表执行操作?无论如何,文档通常是一个好的开始。
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;