===== 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: * Tabelle für das Protokollieren der Fehler erstellen * Insert Befehl um die "LOG ERRORS INTO" Anweisung erweitern === 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 [[http://docs.oracle.com/cd/E11882_01/appdev.112/e23448/d_errlog.htm|Oracle Dokumentation dbms_errlog ]] === Insert Befehl um LOG ERRORS INTO erweitern === Insert Befehlt mit dem Kommando **"LOG ERRORS INTO ('') RECJECT LIMIT "** 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: * [[http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9014.htm#BGBEIACB| Oracle Dokumentation 11g - insert Befehl ]] * [[http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables.htm#sthref2211| Oracle Dokumentation 11g - Bulk Collect Error Handling ]] Netz: * [[http://www.oracle-developer.net/display.php?id=329|dml error logging in oracle 10g release 2]]