Вы не очень подробно рассказали о своих требованиях.Вот простая таблица журнала ошибок и процедура для записи в нее сообщений об ошибках:
CREATE TABLE error_log (ts TIMESTAMP NOT NULL, msg VARCHAR2(4000));
CREATE PROCEDURE log_error (msg IN VARCHAR2) IS
BEGIN
INSERT INTO error_log (ts, msg)
VALUES (SYSTIMESTAMP, SUBSTR(insert_log.msg, 1, 4000));
END log_error;
Может потребоваться или не потребоваться, чтобы это была автономная транзакция.Это будет зависеть от того, хотите ли вы, чтобы журнал записывал ошибки от процедур, выполняющих откат их изменений.
Как правило, это будет реализовано в более общей системе ведения журналов, которая будет регистрировать не только ошибки, но и предупреждения и отладочную информацию..
Если вы хотите, чтобы инструкция DML (вставка / обновление / удаление) регистрировала ошибку для каждой строки (вместо того, чтобы просто давать сбой в первой строке с ошибками), вы можете использовать предложение LOG ERRORS
- вместоесли оператор потерпел неудачу, оператор выполнится успешно, и строки, которые не были вставлены / обновлены / удалены, будут записаны в указанную вами таблицу журнала ошибок вместе с кодом ошибки и соответствующим сообщением об ошибке.Обратитесь по ссылке, предоставленной vettipayyan.
Если вы хотите, чтобы регистрировались все исключения, возникающие в процедуре, вы можете перехватить их, КОГДА ДРУГИЕ:
BEGIN
-- your code here
EXCEPTION
WHEN OTHERS THEN
log_error(DBMS_UTILITY.format_error_stack);
log_error(DBMS_UTILITY.format_error_backtrace);
RAISE;
END;