触发器直接或间接调用commit都会引起报错;
触发器是无需commit的,而且也不能写commit;
触发器和触发它的DML是同一个事务。DML提交了,触发器也就提交了,所以无需commit;
如果一定要在触发器里面写commit,那也是可以的,可以利用oracle中的自治事务来处理,自治事务相当于事务里的子事务。
原因如下:
1、触发器中使用了DDL语句;如drop table t_a;因为DDL语句隐含了commit;
2、触发器主体使用了commit或rollback等DCL语句。因为DML(delete,update,insert)触发器中不能使用DDL(create,drop,alter)语句,也不能使用事务控制语句(DCL)(rollback,commit,savepoint)。特别注意的是,在触发器的主体中引用的函数(function)/过程(procedure)中也不能有事务控制语句。
3、注意:系统级触发器(system triggers)中可以使用DDL语句。
解决办法:
CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER INSERT OR UPDATE OR DELETE OF xxx ON TABLE_NAME
declare
PRAGMA AUTONOMOUS_TRANSACTION; --自治事务 |
BEGIN PROCEDURE_NAME(XXX,XXX……);
COMMIT; |