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
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
Telefon:
089 6228 6789-0
Telefon (gültig bis Ende 2010):
089 679090-40
E-Mail:
› info@muniqsoft.de
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.