如何将组事务提交到 oracle 中的存储过程

Posted

技术标签:

【中文标题】如何将组事务提交到 oracle 中的存储过程【英文标题】:How to commit group transaction to a stored procedure in oracle 【发布时间】:2019-10-02 16:14:05 【问题描述】:

我有一个将数据插入表的过程,并在最后有一个提交语句。它提交对过程的每次调用并插入数据。

create or replace procedure abc
begin 
  insert stmt;
  commit;
end;

现在,我想知道是否有一种方法可以通过事务(组事务)结束时的过程将多个插入提交到表中。这意味着,我不想在每次调用过程时(从前端)都提交,但是在多次调用过程之后,我需要提交。

【问题讨论】:

你如何执行那个过程? 【参考方案1】:

一起从过程中删除提交。将其移至调用进程。例如:

Create or replace procedure procedure abc(p1 varchar2, p2 ...)
is
begin
    insert ....
end abc; 

然后调用过程变成这样:

begin 
    for vars in (select c1, c2, ... from tab)
    loop
       ....
       abc(vars.v1, vars.c2, ...);
   end loop; 

   COMMIT;  -- only when transaction is complete;
end ; 

注意;调用进程不一定是plsql,可以是任何可以建立数据库连接的进程。

【讨论】:

【参考方案2】:

尝试创建带参数的过程。该参数可以采用以下值:Y 或 N(或您需要的方式),并根据该值,您将提交或不提交。

例子:

create or replace procedure abc (commit_y_n varchar2) as
begin 
insert stmt;
if abc.commit_y_n == 'Y' then 
commit;

end;

【讨论】:

以上是关于如何将组事务提交到 oracle 中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

spring 事务对存储过程管用吗?

oracle 执行存储过程时出现卡死

一个存储过程中更新多个表可以用一个COMMIT吗 ?

oracle如何看到transaction执行过程

Oracle 中的事务

如何在Oracle中使用Java存储过程