Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:sql_insert_error_handling

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
prog:sql_insert_error_handling [2013/08/31 21:46] gpipperrprog:sql_insert_error_handling [2014/07/08 21:00] (aktuell) – [Quellen] gpipperr
Zeile 1: Zeile 1:
 +===== 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 ===
 +
 +<code sql>
 +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;
 +/
 +</code>
 +
 +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 <ERROR_TABELLE> ('<TAG>') RECJECT LIMIT <count>"** erweiterten:
 +
 +<code sql>
 +insert /*+ append */  
 +  into emp 
 +select /*+ PARALLEL(EMP) */ *
 + from emp_import
 +  LOG ERRORS INTO ERR_EMP ('DAILY_RUN') REJECT LIMIT 100
 +/
 +</code>
 +
 +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:
 +<code sql>
 +update emp set empno=10000 LOG ERRORS INTO ERR_EMP ('DAILY_RUN') REJECT LIMIT 3;
 +
 +</code>
 +
 +
 +In der Fehler Tabelle wird die Fehler Nummer, der Tag des Laufes und die Wert, die eingefügt werden sollten, dokumentiert.
 +
 +Fehler auswerten:
 +<code sql>
 +
 +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
 +..
 +..
 +..
 +
 +</code>
 +
 +
 +==== 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]]
  
prog/sql_insert_error_handling.txt · Zuletzt geändert: 2014/07/08 21:00 von gpipperr