如果我错了,请纠正我,但我的印象是调用RAISE_APPLICATION_ERROR()会强制ROLLBACK。当执行ROLLBACK语句的ROLLBACK语句和/或方法不在PL / SQL触发器中时,如何允许对RAISE_APPLICATION_ERROR()进行调用?
我觉得我在这里错过了一个关键点:)
提前致谢!
答案 0 :(得分:3)
考虑自己纠正。有点。提升(或遇到)异常并不会导致软件事务的回滚。来自the documentation:
在大多数情况下,如果触发器运行引发异常的语句,并且异常不由异常处理程序处理,则数据库将回滚触发器及其触发语句的效果。
请注意,它是声明,而不是交易;但是"角色支持"我觉得有点混乱...
每个语句都有一个隐式保存点,触发器异常会回滚到该保存点(after
触发器除外,如文档中所述)。来自Tom Kyte的 Expert Oracle Database Architecture :
Oracle通过静默包装SAVEPOINT aroind我们对数据库的每次调用来实现这个语句级别的原子性。
答案 1 :(得分:2)
在触发器内RAISE_APPLICATION_ERROR不执行ROLLBACK,它会中止当前操作,即单个UPDATE / INSERT / DELETE。触发器内的所有内容都属于这样的操作(这也是着名错误的原因" ORA-04091 - 表正在变异,触发器/功能可能看不到它")。
回滚会恢复当前事务(或最多给定的保存点)内的所有更改,这些更改会有所不同。