Zu Oracle

Bereich:
Versionsinfo:
PL/SQL
9.2, 10.2, 11.1
Erstellung:
Letzte Überarbeitung:
08/2001 HA
05/2009 HA
 Als PDF Downloaden!

Erweiterung zu FORALL in 9i: SAVE EXCEPTIONS

Die mit Version 8i eingeführte Möglichkeit, über FORALL DML-Befehle zu bündeln, hatte den Nachteil, dass nach Auftreten eines Fehlers die übrigen DML-Befehle des Arrays nicht mehr durchgeführt wurden. Seit Version 9i besteht die Möglichkeit, mit SAVE EXCEPTIONS alle Befehle komplett durchlaufen zu lassen. Die Exception wird erst hinterher ausgelöst und muss dann auch abgefangen werden. Die zugehörige Fehlernummer ist ORA-24381.

Neu eingeführt wurde dazu auch das Cursor-Attribut %BULK_EXCEPTIONS. Mit ihm kann abgefragt werden

  • wie viele Fehler aufgetreten sind
  • in welchen Durchläufen Fehler aufgetreten sind
  • welche Fehler aufgetreten sind

Beispiel:

DECLARE
   TYPE table_type IS TABLE OF emp.empno%TYPE;
   v_table table_type;
   count_errors NUMBER;
   v_bulk_ex EXCEPTION;
   PRAGMA EXCEPTION_INIT(v_bulk_ex, -24381);
BEGIN
   SELECT empno
     BULK COLLECT INTO v_table
     FROM emp;
   FOR i IN 1..5 LOOP
      v_table(i*2):= v_table(i*2) +1;
   END LOOP;
   FORALL i IN v_table.FIRST..v_table.LAST SAVE EXCEPTIONS
      INSERT INTO emp (empno)
      VALUES(v_table(i));
EXCEPTION
   WHEN v_bulk_ex THEN
      count_errors := SQL%BULK_EXCEPTIONS.COUNT;
      DBMS_OUTPUT.PUT_LINE('Anzahl der Fehler: '
      ||count_errors);
      FOR i in 1..count_errors LOOP
         DBMS_OUTPUT.PUT_LINE('Fehler in Runde '||
             SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
          DBMS_OUTPUT.PUT_LINE('Aufgetretener Fehler '||
             SQL%BULK_EXCEPTIONS(i).ERROR_CODE);
      END LOOP;
END;

Ausgabe (verkürzt):
Anzahl der Fehler: 9
Fehler in Runde 1
Aufgetretener Fehler 1
Fehler in Runde 3
Aufgetretener Fehler 1
........
Fehler in Runde 14
Aufgetretener Fehler 1

Der hier ständig auftretende Fehler ist eine Verletzung des Primary Key (ORA-00001). Als Fehlercode wird also nur die Nummer allein (ohne führende Nullen und ohne ORA-) ausgegeben.

Ohne SAVE EXCEPTIONS würde die Ausführung bereits für i=1 unterbrochen und in den Exception-Teil verzweigt werden

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (gültig bis Ende 2010):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.