EXCEPTION

Fehlerbehandlung zur Laufzeit heißt in PL-SQL 'EXCEPTION Handling'. Eine EXCEPTION ist zur Laufzeit das Eintreten eines an dieser Stelle nicht vorgesehenen Ereignisses (Laufzeitfehler). Sie sind nicht zu verwechseln mit einem syntaktischen oder semantischen Fehler, der vom Parser zurückgewiesen wird. Das EXCEPTION-Handling gehört zu den optionalen Bestandteilen eines PL/SQL-Blockes.

EXCEPTIONS können

Syntax des EXCEPTION-Handlers in PL-SQL:

    EXCEPTION
    WHEN EXCEPTION1 [OR EXCEPTION2...] THEN
      Anweisung 1;
      Anweisung 2; ... 
   [WHEN EXCEPTION3 [OR EXCEPTION4...] THEN
      Anweisung 1;
      Anweisung 2; ... ] ... ]
   [WHEN OTHERS THEN
      Anweisung 1;
      Anweisung 2; ...];

Ein EXCEPTION-Handler besteht also aus einer Reihe von Anweisungen, die ausgeführt werden, wenn ein bestimmter Fehler auftritt. Welche und wie viele Anweisungen vorgesehen sind, ist dem Anwendungsentwickler überlassen. Genauso muss vom Anwendungsentwickler festgelegt werden, für welche Fehler eine Fehlerbehandlungsroutine geschrieben wird. Tritt ein Fehler auf, ohne dass er durch eine EXCEPTION abgefangen wird, erzeugt das DBMS die Fehlermeldung 'UNHANDLED EXCEPTION' und zeigt die Oracle-Fehlermeldung an, die ja zumindet für Anwendungsentwickler recht informativ ist.

Problematisch kann die WHEN OTHERS-EXCEPTION sein, wenn sie nicht richtig programmiert ist, schlimmstenfalls wird gar kein Fehler angezeigt und das Programm terminiert korrekt, obwohl seine Ausführung eigentlich abgebrochen wurde (z.B. WHEN OTHERS THEN NULL;). Sinnvolle WHEN OTHERS-EXCEPTIONS zeigen die Oracle-Fehlermeldung mittels SQLCODE und/oder SQLERRM an und brechen die Prozedur mittels unbehandeltem RAISE-Fehler oder mittels RAISE_APPLICATION_ERROR das Programm fehlerhaft ab. Aber da das eigentlich nur eine Simulation des Oracle-Fehlerrverhaltens ist, lautet die Empfehlung: Am Besten auf die WHEN OTHERS verzichten.

Beispiel:

Prozedur zum Löschen des Lagebeständs von Teilen:

   CREATE OR REPLACE PROCEDURE Loesche_Lagerbestand
   (p_Teilenr  IN   Teile.TNr%TYPE) 
   IS
       v_Nr         Teile.TNr%TYPE;
   BEGIN
      SELECT TNr INTO v_Nr
        FROM Teile
       WHERE TNr = p_Teilenr;
      -- hier geht's weiter, wenn genau ein Datensatz gefunden wird.
      -- da die TNr Primärschlüssel in der Teile-Tabelle ist, ist dies hier der Normalfall
      DELETE FROM Lagerbestand
       WHERE TNr = p_Teilenr;
      COMMIT;
   EXCEPTION
      -- hier landet das Programm, wenn eine falsche TNr übergeben wurde, die es gar nicht gibt
      WHEN NO_DATA_FOUND THEN
	   ROLLBACK;
           DBMS_OUTPUT.PUT_LINE (p_Teilenr ||' gibt es nicht in der Teile-Tabelle!');
      -- dieser Fall kann eigentlich nicht auftreten, da TNr Primärschlüssel ist und damit der Zugriff immer eindeutig
      -- auf diese EXCEPTION kann in diesem Fall verzichtet werden und ist hier der Vollständigkeit halber aufgeführt
      WHEN TOO_MANY_ROWS THEN
	   ROLLBACK;
	   DBMS_OUTPUT.PUT_LINE (p_Teilenr ||' gibt es doppelt in der Teile-Tabelle!');
   END;

Quellen:

  • Faeskorn-Woyke, Heide; Bertelsmeier, Birgit; Riemer, Petra; Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Feuerstein, Steven, Pribyl. Bill: "Oracle PL/SQL Programming", O'Reilly, 2009, ISBN-13: 978-0596514464
  • Oracle® Database SQL Language Reference 11g Release 1 (11.1) in http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
  • Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) in http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • Saurabh, Gupta: "Oracle Advanced PL/SQL Developer Professional Guide", Packt Publishing Limited, 2012, ISBN 978-1-84968-722-5

Kategorie: Oracle-PL-SQL, E