在函数/过程中的 DML 操作之后是否需要提交?

kup*_*upa 20 oracle stored-procedures dml functions

我想知道是否有必要在函数/过程中插入/删除/更新后写入提交?

例子:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;
Run Code Online (Sandbox Code Playgroud)

或程序

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;
Run Code Online (Sandbox Code Playgroud)

删除后需要提交吗?

无法理解以下情况:

  1. 如果我从 SQL 窗口调用函数/过程,那么它需要提交

  2. 如果我使用 dbms_scheduler 调度函数/过程并运行该作业,则会自动提交 delete 语句。

    为什么?

Jus*_*ave 24

一般来说,程序不应该提交。这些类型的事务控制决策应该留给知道逻辑事务何时实际完成的更高级别的代码。如果您在存储过程内部提交,则会限制其可重用性,因为希望该过程所做的更改成为更大事务的一部分的调用者不能简单地直接调用该过程。

如果您以交互方式调用过程,则必须显式提交或回滚事务,因为 Oracle 不知道您是否打算将过程调用作为逻辑事务,或者是否打算组成一个涉及多个过程调用的更大事务。如果使用dbms_scheduler, 则dbms_scheduler假定作业是逻辑事务,并在作业结束时提交,假设它成功(dbms_job做同样的事情)。

函数不应该首先操作数据。不能从 SQL 语句调用操作数据的函数(除非函数本身被声明为使用几乎从不合适的自治事务)。同时拥有函数和过程的全部意义在于,函数可以嵌入到 SQL 语句中,并且可以更自由地授予用户,因为它们不会更改任何数据。

  • @NickChammas - Oracle 没有嵌套事务的概念,没有。如果过程提交,则调用者在该点之前所做的一切都将提交。调用者总是用它的第一条语句隐式地启动一个事务(无论是过程调用还是其他什么),所以它应该总是由调用者来结束事务。 (4认同)