在 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 中执行存储过程后是不是发生任何自动提交?的主要内容,如果未能解决你的问题,请参考以下文章