我在oracle DB中有3个表。我正在编写一个过程来根据某些条件删除所有3个表中的某些行。
我在程序中逐个使用了所有三个删除语句。在执行提到的存储过程时,执行时是否发生了自动提交?
否则,我是否需要在最后手动编写提交代码?
答案 0 :(得分:12)
数据库级别没有自动提交,但您使用的API可能具有自动提交功能。 From Tom Kyte
那就是说,我想补充一下:
除非您正在进行自主交易,否则您应该远离直接提交程序:From Tom Kyte。
摘录:
我希望PLSQL不支持提交/回滚。我坚信 事务控制必须在最顶层的调用者级别完成。那 是你可以采取这N个存储过程并绑定它们的唯一方法 在一次交易中一起。
此外,还应该注意的是,对于DDL(听起来不像你在程序中做任何DDL,根据你的问题,但只是将其列为潜在的问题),Oracle之前添加了一个隐式提交并在DDL之后。
答案 1 :(得分:5)
没有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;
答案 2 :(得分:0)
存储过程范围内没有自动提交。但是,如果您使用的是SQL Plus或SQL Developer,则可能会根据设置自动提交。
您应该将提交和回滚作为存储过程代码的一部分进行处理。