在Oracle中多个插入只能使触发器触发一次吗?

时间:2018-09-26 06:46:24

标签: oracle oracle11g

我正在尝试发送要在table中插入的邮件。我可能在.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;

我们如何进行更新? 谢谢

1 个答案:

答案 0 :(得分:4)

问题在于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语句连接到单个结果集中。