文件错误?带有未处理异常的子程序不执行任何回滚?

Posted

技术标签:

【中文标题】文件错误?带有未处理异常的子程序不执行任何回滚?【英文标题】:Document error? Subprogram with an unhandled exception does not do any rollback? 【发布时间】:2018-01-04 06:02:44 【问题描述】:

doc: 的以下陈述有效吗?

如果退出存储子程序时出现未处理的异常,PL/SQL 不给 OUT 参数赋值,也不做任何回滚

根据语句ROLLBACK,当我的存储过程testy 引发未处理的异常时,不应发生。根据文档插入 3,插入 2 应该成功,但没有插入成功。

create table mytable (num int not null primary key);

insert into mytable values(1);

create or replace procedure testy is
begin
insert into mytable values(2);
insert into mytable values(1); //throws error: ORA-00001: unique constraint (SRISRI1.SYS_C0011447) violated
end;

create or replace procedure testp is
begin
insert into mytable values(3);
testy;
insert into mytable values(4);
end;

exec testp; 

select * from mytable;

mytable
_______
1

【问题讨论】:

【参考方案1】:

我们已经在您的previous topic 中讨论过,不是吗?

威廉·罗伯逊说:

您可以将整个匿名块视为一个单独的块 DML 语句。如果失败,它会回滚到自己的开始,就像 更新等。

您通过 INSERT INTO 语句插入了值“1” 然后你调用了 TESTP 插入“3” 叫 TESTY 其中 插入“2” 尝试插入“1”但失败

Oracle 执行了 隐式回滚 并恢复了 INSERT 2 和 INSERT 3,这会将您返回到起点,即您在执行 TESTP 过程之前遇到的情况,即 表中的值 1。

【讨论】:

不,我的意思是我的问题是不同的。根据文档“不做任何回滚”,以防“存储的子程序带有未处理的异常”。但实际有回滚。 不是明确地,但是 - 如果你真的阅读你所看到的,它不会造成任何伤害。当 PL/SQL 块失败时,Oracle 执行了隐式回滚。 Oracle 执行的所有处理都将被称为隐式对吗?如果不是,Oracle 如何显式处理任何不同? 是您(开发人员)明确 做某事。例如,当您运行 ALTER TABLE 语句时,Oracle 将隐式 提交任何以前的更改。当您最后插入、更新、删除和提交时,您明确命令 Oracle 保存更改,即提交 好的,但是oracle在这种情况下没有做任何回滚,我也没有。那为什么这些回滚;

以上是关于文件错误?带有未处理异常的子程序不执行任何回滚?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL——05异常处理

捕获引擎执行异常

异常处理

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务

Django 事务回滚 HTTP 错误响应

异常处理