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;