В сервере Oracle Database 10 g Release 2 в операторах DELETE, INSERT, MERGE и UPDATE можно использовать новое предложение LOG ERRORS (протоколировать ошибки). Использование этого предложения в операторах массовой обработки данных позволяет записывать строки, при обработке которых произошли ошибки, и не откатывать весь этот оператор.
create table test_el(pole1 integer, pole2 varchar2(100));
exec dbms_errlog.create_error_log('test_el','test_el_errlog');
Cоздание таблицы для сохранения записей, отклоненных DML-предложением.
test_el_errlog - создаваемая таблица для логов
test_el - исходная таблица
Выполним оператор, в поле POLE1 пытаемся внести символ 'g'
insert into test_el values ('g','что-то') log errors into test_el_errlog reject limit unlimited;
Вставлено: 0 строк
Как видим вставки не произошло.
А теперь посмотрим сдержимое таблицы test_el_errlog
select * from test_el_errlog;
ORA_ERR_NUMBER$ ORA_ERR_MESG$ ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ POLE1 POLE2
--------------------------------- --------------------------- ----------------------------- ----------------------------- ------------------------- ---------- -----------
1722 ORA-01722: invalid number I g что-то
ORA_ERR_NUMBER$ - номер ошибки
ORA_ERR_MESG$ - который показывает сообщение об ошибке.
ORA_ERR_ROWID$ - заполняется идентификатором этой ROWID при UPDATE и DELETE
ORA_ERR_OPTYP$ - записывается операция при которой возникла ошибка
ORA_ERR_TAG$ - незнаю назначения
Все столбцы таблицы test_el
В таблицу test_el_errlog (некорректные записи для таблицы test_el) будут записываться все строки, которые нарушают ограничения; например, будут протоколироваться ошибки, вызванные слишком большими значениями столбцов, нарушениями ограничений целостности (ограничения NOT NULL, уникальности, ссылочной целостности и проверочные), ошибки,
возникающие при выполнении триггеров, ошибки преобразования типа столбца подзапроса к типу соответствующего столбца таблицы, ошибки распределения строк по секциям и некоторые ошибки при выполнении оператора MERGE (обновление со вставкой), например, ORA-30926: Unable to get a stable set of rows for MERGE operation - невозможно получить устойчивый набор строк для операции MERGE.
Когда возникает ошибка, строка, вызвавшая ее, протоколируется в таблице "некорректных записей" наряду с номером ошибки, текстом сообщения об ошибке, типом операции (INSERT, UPDATE или DELETE), а также с идентификатором этой строки ROWID (для операций UPDATE и DELETE).
|