【问题标题】:Can be make trigger fire only once for mutiple insert in oracle?在oracle中多次插入只能触发一次吗?
【发布时间】:2018-09-26 17:55:27
【问题描述】:

我正在尝试发送邮件以插入表中。我在 .pdc 中有多个插入。

我们可以这样做吗?

我尝试一次插入多条记录。

INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES ('John', 123, 'Lloyds Office')
  INTO mytable (column1, column2, column_n) VALUES ('Jane', 124, 'Lloyds Office')
  INTO mytable (column1, column2, column_n) VALUES ('Billy', 125, 'London Office')
SELECT * FROM dual;

但它仍然触发了 3 次。

我写的触发器是这个。

CREATE OR REPLACE TRIGGER myschema."my_trigger"
AFTER INSERT OR UPDATE OR DELETE ON myschema.mytable
 begin
   ----- email notification here
 END;

谢谢。

我写了.pdc,当我执行它时,我在其中为表编写了多个插入。当 DML 发生多次时,它会触发多次。

我已经阅读了很多块我没有找到任何这样的答案。

我们可以让它只开火一次吗?

编辑

为了更新

update mytable  set column2 = 123 where column1=  'first';
update mytable  set column2 = 124 where column1=  'second';
update mytable  set column2 = 125 where column1=  'first';
commit;

我们如何为更新做同样的事情? 谢谢

【问题讨论】:

  • 已添加insert all
  • 您不能在插入结束时 - 将另一个值插入到具有所需触发器的虚拟表中吗?
  • @Plirkee - 插入虚拟表将如何触发目标表上的触发器?
  • @APC 我的意思是,如果它是 OP 正在运行的脚本,那么触发器可能会进入虚拟表而不是目标表。并且虚拟表每次运行只能更新一次 - 因此触发器也执行一次。
  • @Plirkee - 如果不将触发器构建在虚拟表而不是它们相关的实际表上,触发器还不够糟糕吗?无论如何,正确的解决方案是修复 INSERT 语句而不是基础结构。

标签: oracle oracle11g


【解决方案1】:

问题在于 INSERT ALL 将每个分支作为单独的语句执行。所以这...

INSERT ALL
  INTO mytable (column1, column2, column3) VALUES ('John', 123, 'Lloyds Office')
  INTO mytable (column1, column2, column3) VALUES ('Jane', 124, 'Lloyds Office')
  INTO mytable (column1, column2, column3) VALUES ('Billy', 125, 'London Office')
SELECT * FROM dual;

... 实际上是三个 INSERT 语句,因此您的语句级触发器会触发 3 次。

如果要在单个语句中插入多行,则需要使用 INSERT INTO ... SELECT 语法,如下所示:

INSERT INTO mytable (column1, column2, column3)
select 'John', 123, 'Lloyds Office' from dual
union all 
select 'Jane', 124, 'Lloyds Office' from dual
union all 
select 'Billy', 125, 'London Office' from dual
;

此示例使用 Oracle 虚拟表 DUAL 生成一行,并使用 UNION ALL 运算符将多个 SELECT 语句连接到一个结果集中。

【讨论】:

  • 你能说出下面的语句是如何工作的吗?请您描述一下或者给个链接。两者运行是否有任何性能差异?
猜你喜欢
  • 2011-12-06
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2020-07-23
  • 2021-03-22
  • 2015-09-07
相关资源
最近更新 更多