大家都知道触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务…

  • Post author:
  • Post category:其他


大家都知道触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务

DML提交了,触发器的操作也提交了,所以无需Commit;否则就会造成错误信息。

当然,如果你一定要在触发器里写COMMIT,那也是可以的,可以用Oracle中的自治事务来处理,自治事务就相当于一个事务里的子事务。

在正常情况下,Oracle规定在触发器中不能运行 DDL(即Create/Alter/Drop)语句和Commit/Rollback语句的,因为DDL操作是隐性提交的,在触发器不允许有Commit,如在触发器中加入DDL语句,这种隐性提交就会导致错误信息;但有时特殊情况下需要在触发器中使用DDL语句,这时怎么办。

可以采取以下的解决办法:

1.在可以在触发器中加入:pragma autonomous_transaction;(在DECLARE后面) 表示是自由事务处理。

如:

CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_Tax_INS_BD

for each row

DECLARE

pragma autonomous_transaction;

NRDSId varchar(500):=”;

begin

通过以上方法即可解决触发器中不能有DDL语句的问题!



版权声明:本文为yjxin0302原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。