PL/SQL块中插入操作的异常处理行为咨询
PL/SQL异常处理器相关问题解答
先修正你示例代码的语法问题(多了一个END,补充THEN,修正错误信息变量),整理后的代码如下:
Begin Insert into (Select.. union all..); -- 单行插入语句 Exception When others THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END; /
问题解答
1. 执行成功时会COMMIT插入操作吗?
不会。PL/SQL块本身不会自动提交事务,除非你在块内显式编写COMMIT;语句。默认情况下,插入操作会处于未提交状态,需要外部显式执行COMMIT命令,或者由调用环境完成提交。
2. 出现约束错误时会ROLLBACK还是不执行任何操作?
当出现约束错误时,当前块内的插入语句会被自动回滚,但整个事务不会被完全回滚——除非你在异常处理器里显式写了ROLLBACK;。也就是说,这个失败的插入操作不会影响事务中之前的其他操作,异常触发后,程序会跳转到异常处理器执行错误输出逻辑,随后块正常结束。
3. 如何确保块前后的处理不受该块执行结果影响?
要彻底隔离这个PL/SQL块与前后事务的关联,有两种可靠方案:
方案一:使用自治事务(完全隔离)
给块添加自治事务注解,让块内操作在独立事务中执行,成功时显式提交,失败时显式回滚,完全不干扰外部事务:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; Begin Insert into (Select.. union all..); COMMIT; -- 成功则提交自治事务 Exception When others THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); ROLLBACK; -- 失败则回滚自治事务 END; /
方案二:使用保存点(局部回滚)
如果不需要独立事务,可在块执行前创建保存点,异常时回滚到该保存点,仅撤销块内操作,不影响之前的事务内容:
-- 块之前的处理逻辑 SAVEPOINT before_my_block; Begin Insert into (Select.. union all..); Exception When others THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); ROLLBACK TO before_my_block; -- 回滚到块执行前的状态 END; / -- 块之后的处理逻辑,不受块内操作结果影响
内容的提问来源于stack exchange,提问作者Himanshu
相关产品推荐
相关产品推荐

