ORA-04088: ошибка при выполнении триггера - дополнительные ошибки

У меня есть пустая таблица, для которой я настроил триггер:

CREATE OR REPLACE TRIGGER   authors_bir
BEFORE INSERT ON authors
FOR EACH ROW

begin
  if upper(:new.name) = 'TEST' then
    raise_application_error(-20001, 'Sorry, that value is not allowed.');
  end if;
end;

После выполнения:

insert into AUTHORS
    VALUES (1, 'test', '1-Jan-1989', 'M');

Почему я получаю сообщения об ошибках ORA-06512 и ORA-04088 в дополнение к ожидаемому сообщению об ошибке ORA-20001?

Сообщение об ошибке

Error starting at line : 5 in command -
insert into AUTHORS
    VALUES (1, 'test', '1-Jan-1989', 'M')
Error report -
ORA-20001: Sorry, that value is not allowed.
ORA-06512: at "RPS.AUTHORS_BIR", line 3
ORA-04088: error during execution of trigger 'RPS.AUTHORS_BIR'

2 ответа

Решение

Ваш триггер работает отлично, и ORA-06512 является частью режима отладки и сообщает вам, какую строку кода поднял тот ORA-20001, который вы кодировали. Пока ORA-04088 говорит, что в триггере произошла ошибка. Оба кода ошибки являются ОБЩЕЙ частью отчета об устранении неисправностей оракула.

Согласно документации:

ORA-06512: в строке

Причина: сообщение Backtrace, поскольку стек разматывается необработанными исключениями.

По сути, эта ошибка является частью стека ошибок, сообщающего, в какой строке произошла фактическая ошибка.

И документация:

ORA-04088: ошибка во время выполнения триггера 'string.string'

Причина. Произошла ошибка во время выполнения триггера.

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

При возникновении необработанной ошибки всегда отображается стек ошибок. Если вы хотите отобразить только сообщение об ошибке, вы можете использовать часть обработки исключений, чтобы тело триггера выглядело примерно так:

begin
  if upper(:new.name) = 'TEST' then
    raise_application_error(-20001, 'Sorry, that value is not allowed.');
  end if;
exception
  when others then
    dbms_output.put_line(sqlcode|' '|sqlerrm);
end; 
Другие вопросы по тегам