oracle--触发器

触发器直接或间接调用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;
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值