Запрос вне области транзакции - Oracle - PullRequest
1 голос
/ 27 января 2020

Можно ли использовать оператор вставки вне области транзакции в Stored Pro c?
Таким образом, существует хранимый pro c, который записывает некоторые вставки как часть транзакции
Причиной этого является запись в таблицу Audit и ведение записей аудита, даже если сохраненный pro c завершается с ошибкой или получает разъяснение

исключения, извините, если неясно, я пишу несколько аудитов для каждого действие процедуры, чтобы я мог отслеживать, что он сделал, а что не удалось. не просто один Аудит, когда есть исключение ...

CREATE OR REPLACE PROCEDURE sampleProc
IS
BEGIN

  start a transaction
      INSERT to table 1
      write to audit table about insert 1
      INSERT to table 2
      write to audit table about insert 2
      INSERT to table 3
      write to audit table about insert 3
      INSERT to table 4
      write to audit table about insert 4

     if there is an exception - rollback except audit 
     all ok? commit.

END;
/

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Да, есть возможность выполнять действия в отдельной транзакции, выполняемой одновременно с вашей основной. Подробнее здесь

Пример:

create table logs(creation_date date default sysdate, msg varchar2(4000));

create or replace procedure log_proc(sMessage varchar2)
is
  pragma autonomous_transaction;
begin
  insert into logs(msg)
  values(sMessage);
  commit; -- don't forget to commit in this separate transaction
end;
/

begin
  log_proc('some message');
  rollback;
end;
/

select * from logs
1 голос
/ 27 января 2020

То, что вам нужно, это PRAGMA AUTONOMOUS_TRANSACTION, который запускает модуль, используя его в отдельном сеансе.

Ваш код будет выглядеть примерно так:

CREATE OR REPLACE PROCEDURE sample_proc
AS
  procedure audit_insert (<params>)
  is
    pragma autonomous_transaction;
  begin
    <log details>
    commit;
  end audit_insert;
BEGIN
  <INSERT to table 1>;
  audit_insert(...);

  <INSERT to table 2>;
  audit_insert(...);

  ...

EXCEPTION
  when others then
    rollback;
    raise;
END sample_proc;
/

Делать это как это будет означать, что ваши данные аудита будут сохранены независимо от того, будет ли вызывающий код успешным или нет.

NB. Я создал audit_insert как подпроцедуру sample_proc. Лучше иметь код как отдельные процедуры внутри пакета, а не как одну или несколько процедур.

...