PKG_LOGGING.PRC_LOG () имеет оператор commit, поэтому он будет фиксироваться.
Предположим, ваш код выглядел так:
set SERVEROUTPUT on;
begin
insert into TEST_PRAGMA values (3, 300);
PKG_LOGGING.PRC_LOG(SEQ_TEST.NEXTVAL, systimestamp, 'info', 'inserted a record');
update TEST_PRAGMA set COL_1 = 1 where COL_2 = 200;
commit;
EXCEPTION
when DUP_VAL_ON_INDEX then
dbms_output.put_line ('DUP_VAL_ON_INDEX error has occured');
PKG_LOGGING.PRC_LOG(SEQ_TEST.NEXTVAL, systimestamp, 'error', 'test de logging');
rollback;
end;
Сколько записей вы бы имели в TEST_PRAGMA? Три .Потому что вставка была зафиксирована, когда мы вызвали PKG_LOGGING.PRC_LOG (), и, следовательно, откат в обработчике исключений не имел никакого эффекта.И именно поэтому мы должны использовать PRAGMA AUTONOMOUS_TRANSACTION
в процедурах аудита и регистрации: чтобы мы могли успешно сохранять наши сообщения регистрации, не влияя на более широкую транзакцию.
Таким образом, вы должны добавить PRAGMA AUTONOMOUS_TRANSACTION
к PKG_LOGGING.PRC_LOG ().
Кстати, я думаю, вы должны быть осторожны с обработчиком ошибок, подобным этому, в пакете регистрации:
EXCEPTION
when OTHERS then
rollback;
RAISE_APPLICATION_ERROR(-20000, 'other error has occured: ' || sqlcode || ' - ' || sqlerrm);
end PRC_LOG;
В некоторых ситуациях мы определенно хотели бы остановить наш процесс, если мы не можем записать важную информацию.Но в других случаях мы хотим, чтобы регистрация закончилась неудачей.Например, мне нужен пакетный запуск в течение ночи, чтобы завершить работу, если он не может записать ошибки, потому что этот журнал - мой единственный способ узнать, что - если что-то - пошло не так, и лучше всего не запускать его, чтобы он выполнялсяне полностью, и я не знаю, что некоторые вещи не удалось.Но если я просто пишу некоторые сообщения трассировки в Test, я мог бы предпочесть, чтобы длительный процесс завершался без полного набора трасс, а не для завершения, потому что в таблице журналов не хватило места.
Также, использование raise_application_error()
не обязательно.Просто выполните raise;
после отката и покончите с этим.