很少的用于批量绑定和触发器(Oracle 10g中)批量上传并触发
1)的问题将行级触发器中的批量绑定情况下执行?
2)如果是,那么是否有任何选项仅对批量绑定抑制执行?
3)如果没有,那么有没有办法在批量绑定中执行行级触发器?
4)如果行级别触发器执行批量绑定,性能是否会受到影响?
很少的用于批量绑定和触发器(Oracle 10g中)批量上传并触发
1)的问题将行级触发器中的批量绑定情况下执行?
2)如果是,那么是否有任何选项仅对批量绑定抑制执行?
3)如果没有,那么有没有办法在批量绑定中执行行级触发器?
4)如果行级别触发器执行批量绑定,性能是否会受到影响?
执行批量绑定插入操作时,触发器仍处于启用状态并触发。没有什么intinsic可以做,以制止,当然,你可以把自己的逻辑触发,并且不会将批量插入类似如下的代码...
在包装规格:
create or replace package my_packags is
in_bulk_mode boolean default false;
... -- rest of package spec
end;
在触发:
begin
if NOT my_package.in_bulk_mode then
-- do the trigger stuff
end if;
end;
调用代码:
my_package.in_bulk_mode := true;
-- do the bulk insert
my_package.in_bulk_mode := false;
触发器在SQL引擎中执行。批量绑定影响调用语言(pl/sql或任何OCI语言)通过减少调用/语句的数量调用SQL引擎的方式,但不应绕过任何触发器。 (假设您已经使用触发器向数据库添加了验证,日志记录或其他约束,但第三方应用程序仅通过使用批量操作就可以绕过它 - 这将成为数据损坏和安全问题的秘诀)。
您的语句级别触发器应该触发一次。
您可以在做任何事情之前先检查内存中的会话变量来“禁用”触发器,并在批量操作之前明确地设置它。
行级触发器仍然会以每行为基础触发,这可能会产生更多影响。
我知道只有一种方法可以避免启用行级别或语句级别的触发器;在直接路径模式下使用SQL * Loader。 – 2010-09-07 14:49:01
我的意思是批量绑定。 – 2010-09-06 15:03:07
我已经更新了我的答案。 – 2010-09-06 15:17:01