【问题标题】:Function that executes after insert插入后执行的函数
【发布时间】:2015-11-05 11:08:30
【问题描述】:

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

【问题讨论】:

  • 您能否详细说明一下。目前尚不清楚您的确切要求是什么。你想让插入的行以不同的方式处理它吗?如果是,您可以使用RETURNING INTO 子句。看看这里的例子lalitkumarb.com/2015/04/07/…
  • 我认为这与我试图以任何方式解释的内容无关。我想在插入操作后执行一个函数。但我希望插入操作和触发器不是以原子方式执行的。我希望首先执行插入操作,以便我可以在不使用“:new”关键字的情况下对表的新状态(插入新行)运行一个函数。我希望这能让它更清楚一点
  • 也许举个例子会更好。如果您可以编辑您的问题并添加测试用例。我仍然对您的流程感到困惑。触发器是否已经在桌面上做某事?函数要做什么?
  • 你为什么不想使用:new?另外,你不能敲出一个简单的测试用例来证明你正在尝试做什么吗? (例如,创建表和插入语句,以及您所追求的结果)。这样,我们就有更好的机会 a) 找出你所追求的,b) 帮助你实现它。目前有点“我有这件事,我想做另一件事,我希望它最终像这样{挥手}”;几乎不可能破译,因为我们没有和你坐在一起,也看不到你的屏幕。
  • 所以你只想在tableX上插入完成后才执行function1?

标签: oracle function plsql triggers insertafter


【解决方案1】:

您是否收到类似“ORA-04091: table name is mutating”的错误?

当您在触发触发的同一个表中选择、插入或更新时会发生错误。

你可以通过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 次。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我根本不需要识别特定的行。我只需要对表的所有行(包括新插入的行)进行操作。如何创建在插入后仅触发一次的 after 语句触发器?
    • 为什么你需要在插入后对整个表执行操作?无论如何,文档通常是一个好的开始。 docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多