PL-SQL: Exception-Handling
Das Buch PL-SQL wird zurzeit überarbeitet! Änderungen an dieser Seite bitte nur in Absprache mit mir.
Vordefinierte Exceptions
[Bearbeiten]Eine Auswahl an Exceptions. Eine vollständige Liste steht unter [1] zur Verfügung.
Name | Fehlercode | Beschreibung | Vorhanden ab |
---|---|---|---|
CURSOR_ALREADY_OPEN | ORA-06511 | Cursor ist bereits geöffnet | Oracle 7 |
DUP_VAL_ON_INDEX | ORA-00001 | INSERT oder UPDATE eines Wertes, der bereits vorhanden ist, in einer als UNIQUE deklarierten Spalte | Oracle 7 |
INVALID_CURSOR | ORA-01001 | Der Cursor ist nicht deklariert (existiert nicht) oder wurde nicht geöffnet | Oracle 7 |
INVALID_NUMBER | ORA-01722 | Fehler bei impliziter Typkonvertierung, z.B. String enthält keinen numerischen Wert wird aber in NUMBER Spalte/Variable eingefügt bzw. übergeben | Oracle 7 |
LOGIN_DENIED | ORA-01017 | Benutzername oder Passwort falsch | Oracle 7 |
NO_DATA_FOUND | ORA-01403 | SELECT liefert kein Ergebnis: keine Daten wurden durch einen impliziten Cursor gefunden oder ein Index in einem Assoziativen Array existiert nicht | Oracle 7 |
NOT_LOGGED_ON | ORA-01012 | Keine Verbindung zur Datenbank | Oracle 7 |
PROGRAM_ERROR | ORA-06501 | Interner PL/SQL - Fehler | Oracle 7 |
ROWTYPE_MISMATCH | ORA-06504 | Strukturvariablen inkompatibel | Oracle 7 |
STORAGE_ERROR | ORA-06500 | Speicherprobleme | Oracle 7 |
TIMEOUT_ON_RESOURCE | ORA-00051 | Datenbank-Sperre | Oracle 7 |
TOO_MANY_ROWS | ORA-01422 | SELECT liefert mehr als eine Zeile | Oracle 7 |
VALUE_ERROR | ORA-06502 | Fehler beim Arbeiten mit "Werten" in Variablen/Tabellen/Prozeduren, z.B. zu große Werte, Verletzung von Constraints, Fehler bei Typkonvertierungen (außer INVALID_NUMBER - Exception) | Oracle 7 |
ZERO_DIVIDE | ORA-01476 | bei Division durch 0 | Oracle 7 |
ACCESS_INTO_NULL | ORA-06530 | Zuweisung an ein nicht initialisiertes Objekt | Oracle 8 |
ACCESS_INTO_NULL | ORA-06531 | Zugriff auf eine nicht initialisierte Collection (TABLE Variable oder VARRAY) | Oracle 8 |
SELF_IS_NULL | ORA-030625 | Methode eines nicht initialisierten Objekts wird aufgerufen | Oracle 8 |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Index für Zugriff auf eine Collection (TABLE Variable oder VARRAY) ist nicht vorhanden | Oracle 8 |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | ungültiger Index bei Zugriff auf eine Collection (TABLE Variable oder VARRAY) | Oracle 8 |
SYS_INVALID_ROWID | ORA-01410 | Zuweisung eines inkompatiblen/nicht konvertierbaren Datentyps zu einem ROWID-Element | Oracle 8 |
CASE_NOT_FOUND | ORA-06592 | In einem CASE konnte kein WHEN ausgewählt werden und ELSE existiert nicht | Oracle 9i |
Exceptions gelten immer für den Block in dem sie deklariert sind. Da innerhalb eines Blocks auch mehrere Exceptions auftreten können, ist es möglich, diese hintereinander abzufragen. Mit "others" werden alle bis dahin unbehandelten Exceptions abgefangen.
Beispiel:
declare
..
begin
..
exception
when ZERO_DIVIDE then
... -- Fehler behandeln
when others then
... -- Fehler behandeln
end;
mit RAISE können Exceptions erzeugt werden oder auch aus dem aktuellen Block an den umschließenden Block weitergeleitet werden.
declare
..
begin
..
declare
lv_zahl NUMBER (10);
begin
select into lv_zahl 99 from dual;
IF lv_zahl = 99
RAISE INVALID_NUMBER
END IF;
exception
when INVALID_NUMBER
DBMS_OUTPUT.PUT_LINE("99 gilt nicht!");
RAISE;
end;
..
exception
when INVALID_NUMBER
DBMS_OUTPUT.PUTLINE (sqlcode||sqlerrm);
end;
Es wird im inneren Block die Exception abgefangen, mit einer Meldung behandelt und danach an den äußeren Block weitergeleitet. Dort wird durch sqlcode und sqlerrm sowohl die Exception-Nummer als auch der Fehlertext der vordefinierten Exception ausgegeben.