В 10.2 появилось логирование ошибок при выполнение DML команд INSERT, UPDATE, MERGE и DELETE.
Если DML-операция при массовой обработке данных вызывает ошибки при добавлении или изменении, какой либо записи, то вся операция DML будет отменена. Новая инструкция — LOG ERRORS, предназначена для обхода подобных ситуация. Если в процессе выполнения DML операции возникает ошибка, то информация о ней запишется в заранее созданную (при помощи пакета DBMS_ERRLOG) таблицу логов, на которую указывает конструкция LOG ERRORS.
Синтаксис
LOG ERRORS [INTO schema.table] [ (simple_expression) [ REJECT LIMIT {integer|UNLIMITED} ]
REJECT LIMIT указывает на максимально количество ошибок, которое может произойти, прежде чем statement прервётся.
Представим, что у нас при выполнении statement произойдет 2 ошибки, что будет происходить, при разных значениях REJECT LIMIT.
REJECT LIMIT | Ошибка | Логирование | Транзакция |
---|---|---|---|
0 | отразится ошибка | в логе будет 1 строка | автоматический rollback |
1 | отразится ошибка | в логе будет 2 строки | автоматический rollback |
2, больше и UNLIMITED | ошибки не будет! | в логе будет 2 строки | нужно будет подтвердить или откатить транзацию. |
Пример использования
Создаем таблицу
create table xx_test (id number primary key, field1 varchar2(1), field2 varchar2(10) not null);
Напишем скрипт без использования DML error logging
declare i number; begin i := 0; while i <= 10 loop insert into xx_test (id, field1, field2) values (i, i, i); i := i+1; end loop; end; / ORA-12899: значение для столбца "APPS"."XX_TEST"."FIELD1" слишком велико (фактическое: 2, максимальное: 1) ORA-06512: на line 6
Создаем Error Logging Table
begin dbms_errlog.create_error_log('XX_TEST','ERROR_LOG_XX_TEST') ; end; / PL/SQL procedure successfully completed SQL> desc ERROR_LOG_XX_TEST; Name Type Nullable Default Comments --------------- -------------- -------- ------- -------- ORA_ERR_NUMBER$ NUMBER Y ORA_ERR_MESG$ VARCHAR2(2000) Y ORA_ERR_ROWID$ UROWID(4000) Y ORA_ERR_OPTYP$ VARCHAR2(2) Y ORA_ERR_TAG$ VARCHAR2(2000) Y ID VARCHAR2(4000) Y FIELD1 VARCHAR2(4000) Y FIELD2 VARCHAR2(4000) Y
Добавим в скрипт инструкцию LOG ERRORS
SQL> declare i number; 2 begin 3 i := 0; 4 while i <= 10 loop 5 insert into xx_test (id, field1, field2) 6 values (i, i, i) 7 LOG ERRORS INTO ERROR_LOG_XX_TEST REJECT LIMIT 1; 8 i := i+1; 9 end loop; 10 end; 11 / PL/SQL procedure successfully completed SQL> col num$ for 9999999 SQL> col ora_err_mesg$ for a60 SQL> col typ for a4 SQL> col id for a4 SQL> col field1 for a6 SQL> col field2 for a6 SQL> select ora_err_number$ num$, ora_err_mesg$, ora_err_optyp$ typ, id, field1, field2 from ERROR_LOG_XX_TEST; NUM$ ORA_ERR_MESG$ TYP ID FIELD1 FIELD2 ------- ------------------------------------------------------------ ---- ---- ------ ------ 12899 ORA-12899: значение для столбца "APPS"."XX_TEST"."FIELD1" сл I 10 10 10 ишком велико (фактическое: 2, максимальное: 1)
Есть возможность добавлять некие свои данные в таблицу Error Logging
SQL> declare 2 i number; 3 begin 4 i := 0; 5 while i <= 10 loop 6 insert into xx_test (id, field1, field2) 7 values (i, i, i) 8 LOG ERRORS INTO ERROR_LOG_XX_TEST('i='||to_char(i)) REJECT LIMIT 1; 8 i := i+1; 10 end loop; 11 end; 12 / PL/SQL procedure successfully completed SQL> col num$ for 9999999 SQL> col ora_err_mesg$ for a60 SQL> col typ for a4 SQL> col id for a4 SQL> col field1 for a6 SQL> col field2 for a6 SQL> col ora_err_tag$ for a25 SQL> select ora_err_number$ num$, ora_err_mesg$, ora_err_optyp$ typ, ora_err_tag$, id, field1, field2 from ERROR_LOG_XX_TEST; NUM$ ORA_ERR_MESG$ TYP ORA_ERR_TAG$ ID FIELD1 FIELD2 ------- ------------------------------------------------------------ ---- ------------------------- ---- ------ ------ 12899 ORA-12899: значение для столбца "APPS"."XX_TEST"."FIELD1" сл I i=10 10 10 10 ишком велико (фактическое: 2, максимальное: 1)
Дополнительную информацию можно посмотреть здесь: DML Error Logging in Oracle 10g Database Release 2
Последние комментарии