3. Stored Procedures und PL/SQL PL/SQL Exceptions in PL/SQL • Wenn zur Laufzeit ein Fehler auftritt, wird eine PL/SQL-Exception ausgelöst. • Wirkung: Verlassen des aktuellen Blocks, Exceptions können gefangen/behandelt werden. • Zu einer Exception gehört immer eine Fehlernummer, diese sind in SQL grundsätzlich negativ. • Es existieren eine Reihe von vordefinierten Exceptions. • Fehlernummer und zugehörige Exceptions können auch selbst definiert werden. • Exceptions müssen nicht behandelt werden, im Extremfall schlagen sie in der Anwendung auf. Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 86 3. Stored Procedures und PL/SQL PL/SQL Behandlung von Exceptions • Behandlung von Exceptions im Exception-Block mittels when Exception then ...; • Beispiel: when NO_DATA_FOUND then dbms_output.put_line (’Keine Daten verfuegbar:’ || sqlerrm); • Allgemeine Behandlung: when others then ...; Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 87 3. Stored Procedures und PL/SQL PL/SQL Beispiele für vordefinierte Exceptions Exception CURSOR ALREADY OPEN DUP VAL ON INDEX INVALID CURSOR INVALID NUMBER NO DATA FOUND NOT LOGGED ON ROWTYPE MISMATCH STORAGE ERROR TIMEOUT ON RESOURCE TOO MANY ROWS VALUE ERROR ZERO DIVIDE Fehlernummer ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01403 ORA-01012 ORA-06504 ORA-06500 ORA-00051 ORA-01422 ORA-06502 ORA-01476 Erläuterung Cursor ist bereits geöffnet Keine Eindeutigkeit bei Schlüssel Cursor nicht geöffnet bei impliziter Typkonvertierung SELECT liefert kein Ergebnis Keine Verbindung zur Datenbank Strukturvariablen inkompatibel Speicherproblem Datenbank-Sperre SELECT liefert mehr als ein Tupel inkompatible Werte, z.B. Zeichenkette zu kurz defi Division durch 0 Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 88 3. Stored Procedures und PL/SQL PL/SQL Benutzerdefinierte Exceptions • Deklaration von Exceptions mit Hilfe des PL/SQL-Typs EXCEPTION • Benutzerdefinierte Exceptions müssen im declare-Block deklariert werden: declare MEINE_EXCEPTION exception; ... • Exceptions werden ausgelöst mit Hilfe von RAISE: if x <> y then raise MEINE_EXCEPTION end if; • Behandlung dann im Exception-Block: exception when MEINE_EXCEPTION then ... Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 89 3. Stored Procedures und PL/SQL PL/SQL Exceptions und selbstdefinierte DB-Fehlercodes • Abbildung applikationsspezifischer Fehler auf DB-Fehlercodes • In Oracle reservierter Bereich: -20999 bis -20000 • Zurordnung zwischen Exception und Fehlercode durch ein PRAGMA: declare MEINE_EXCEPTION exception; PRAGMA EXCEPTION_INIT(MEINE_EXCEPTION, -20100); ... • Mit Hilfe von raise application error kann dann ein DB-Fehlerzustand mit Fehlermeldung erzeugt werden: if x <> y then raise_application_error(-20100, ’ungueltiger Zustand’); end if; Objektrelationale Datenbanksysteme — Hochschule Bonn-Rhein-Sieg, WS 2012/13 90