转载原文地址:http://blog.csdn.net/zftang/article/details/6586996
大家都知道触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务
DML提交了,触发器的操作也提交了,所以无需Commit;否则就会造成错误信息。
当然,如果你一定要在触发器里写COMMIT,那也是可以的,可以用Oracle中的自治事务来处理,自治事务就相当于一个事务里的子事务。
在正常情况下,Oracle规定在触发器中不能运行 DDL(即Create/Alter/Drop)语句和Commit/Rollback语句的,因为DDL操作是隐性提交的,在触发器不允许有Commit,如在触发器中加入DDL语句,这种隐性提交就会导致错误信息;但有时特殊情况下需要在触发器中使用DDL语句,这时怎么办。
可以采取以下的解决办法:
create or replace trigger trigger_table1
after update or insert on martin.table1
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;--自制事务处理
begin
--调用拆分存储过程,触发器每次只拆分一条
mc_print(
:NEW.id,:NEW.name
);
commit;
end trigger_table1 ;