Error Handing bei Inserts - Fehler bei großen Einfüge Operationen verarbeiten

Bei großen Einfüge Operationen steht man oft vor dem Problem, dass einige wenige fehlerhafte Datensätze den ganzen Lauf „zerstören“.

Oft wäre es aber besser erst den größten Teil der Daten zu verarbeiten und dann erst nach dem Lauf die fehlerhaften Daten zu behandeln.

Dafür steht bei dem Insert Befehlt die Anweisung „LOG ERRORS INTO“ zur Verfügung, mit dem „REJECT LIMIT“ kann definiert werden, wie viele Fehler toleriert werden sollen, bis eine „echte“ Exception den Lauf abbricht.

Ablauf:

Error Tabelle mit dbms_errlog erstellen

SET serveroutput ON 
BEGIN
  -- Source Table - Error Table 
  dbms_errlog.create_error_log ( DML_TABLE_NAME     => 'EMP'
                               , ERR_LOG_TABLE_NAME => 'ERR_EMP');
exception
    WHEN others
    THEN
       dbms_output.put_line ('Error create error log :: '  || sqlerrm);
END;
/

siehe auch Oracle Dokumentation dbms_errlog

Insert Befehl um LOG ERRORS INTO erweitern

Insert Befehlt mit dem Kommando „LOG ERRORS INTO <ERROR_TABELLE> ('<TAG>') RECJECT LIMIT <count>„ erweiterten:

INSERT /*+ append */  
  INTO emp 
SELECT /*+ PARALLEL(EMP) */ *
 FROM emp_import
  LOG ERRORS INTO ERR_EMP ('DAILY_RUN') REJECT LIMIT 100
/

Der optionale Tag ist später sehr hilfreich, in der Error Tabelle den fehlerhaften Lauf zu identifizieren.

Update Beispiel

Beispiel für ein fehlerhaftes Update:

UPDATE emp SET empno=10000 LOG ERRORS INTO ERR_EMP ('DAILY_RUN') REJECT LIMIT 3;

In der Fehler Tabelle wird die Fehler Nummer, der Tag des Laufes und die Wert, die eingefügt werden sollten, dokumentiert.

Fehler auswerten:

SELECT * FROM ERR_EMP;
 
-- Transponierte Darstellung ! 
 
ORA_ERR_NUMBER$  => 1438
ORA_ERR_MESG$    => ORA-01438: Wert größer als die angegebene Gesams
ORA_ERR_ROWID$   => unsupported Datatype ::208
ORA_ERR_OPTYP$   => U
ORA_ERR_TAG$     => DAILY_RUN
EMPNO            => 10000
..
..
..

Quellen

siehe auch :

Oracle:

Netz: