Главная > SQL > DML Error Logging


DML Error Logging

В 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

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

Похожие записи:

Categories: SQL Tags: , , , ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.