То, что вам нужно, это 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
. Лучше иметь код как отдельные процедуры внутри пакета, а не как одну или несколько процедур.