在 oracle 中执行存储过程后是不是发生任何自动提交?

Posted

技术标签:

【中文标题】在 oracle 中执行存储过程后是不是发生任何自动提交?【英文标题】:Is there any auto commit happens after executing stored procedures in oracle?在 oracle 中执行存储过程后是否发生任何自动提交? 【发布时间】:2015-12-09 15:43:59 【问题描述】:

我在 oracle DB 中有 3 个表。我正在编写一个程序来根据某些条件删除所有 3 个表中的某些行。

我在过程中一一使用了所有三个删除语句。在执行上述存储过程时,执行时是否发生了自动提交?

否则,我是否需要在最后手动编码提交?

【问题讨论】:

在 PL/SQL 函数或过程中没有自动提交。 我正在使用 oracle 命令行。在那,我正在执行上述过程。执行完之后,我是否需要手动输入commit命令,因为我在存储过程中使用了delete语句。 【参考方案1】:

数据库级别没有自动提交,但您使用的 API 可能具有自动提交功能。 From Tom Kyte.

也就是说,我想补充一下:

除非您正在执行自主事务,否则您应该远离直接在过程中提交:From Tom Kyte。

摘录:

我希望 PLSQL 不支持提交/回滚。我坚信 事务控制必须在最高调用者级别完成。那 是您可以采用这 N 个存储过程并绑定它们的唯一方法 一起交易。

此外,还应该注意的是,对于 DDL(根据您的问题,这听起来不像您在程序中执行任何 DDL,但只是将其列为潜在的陷阱),Oracle 在之前添加了一个隐式提交在 DDL 之后。

【讨论】:

【参考方案2】:

没有autocommit,但是可以在存储过程中设置commit命令。

示例 #1:no commit

create procedure my_proc as
begin
  insert into t1(col1) values(1);
end;

当你执行你需要调用的过程时commit

begin
  my_proc;
  commit;
end;

示例 #2:commit

create procedure my_proc as
begin
  insert into t1(col1) values(1);
  commit;
end;

当你执行程序时,你不需要调用commit,因为程序会这样做

begin
  my_proc;
end;

【讨论】:

【参考方案3】:

在存储过程的范围内没有自动提交。但是,如果您使用的是 SQL Plus 或 SQL Developer,则根据设置自动提交是可能的。

您应该将提交和回滚作为存储过程代码的一部分来处理。

【讨论】:

以上是关于在 oracle 中执行存储过程后是不是发生任何自动提交?的主要内容,如果未能解决你的问题,请参考以下文章

多线程调用oracle存储过程是不是并发执行?

oracle中的存储过程,有啥作用,以及怎么在代码中使用?

如何执行存储过程

深入了解oracle存储过程的优缺点

oracle存储过程连续执行结果不同

ORACLE的Job是不是有日志文件,如果有如何查看ORACLE 的Job的日志?