PL-SQL: Exception-Handling

Aus Wikibooks
Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu " Cursor " | One wikibook.svg Hoch zu " Inhaltsverzeichnis " | Wikibooks buchseite.svg Vor zu " Prozedur "


Das Buch PL-SQL wird zurzeit überarbeitet! Änderungen an dieser Seite bitte nur in Absprache mit mir.

Vordefinierte Exceptions[Bearbeiten]

Ein 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.

Referenzen[Bearbeiten]

  1. http://download.oracle.com/docs/cd/E11882_01/server.112/e10880/toc.htm