Как зафиксировать групповую транзакцию для хранимой процедуры в Oracle - PullRequest
1 голос
/ 15 мая 2019

У меня есть процедура, которая вставляет данные в таблицу и в конце имеет оператор commit. Он фиксирует каждый вызов процедуры и вставляет данные.

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

Теперь мне интересно, можно ли как-нибудь зафиксировать несколько вставок в таблицу с помощью процедуры в конце транзакции (групповой транзакции). Это означает, что я не хочу фиксировать каждый раз, когда процедура вызывается (из внешнего интерфейса), но после нескольких вызовов процедуры мне нужно, чтобы это было зафиксировано.

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Удалить коммит из процедуры все вместе. Переместить его в вызывающий процесс. Например:

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, это может быть что угодно, что может установить соединение с базой данных.

0 голосов
/ 15 мая 2019

Попробуйте создать процедуру с параметром.Параметр может принимать значения: Y или N (или как вам нужно), и на основе этого значения вы будете фиксировать или нет.

Пример:

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