Vordefinierte-EXCEPTION

Eine vordefinierte EXCEPTION gehört zu den 20 aum häufigsten vorkommenden Laufzeitfehlern. Es wird einfach der EXCEPTION-Name in der WHEN-Klausel verwendet.

EXCEPTION-NameORACLE-Fehler-Nr.Beschreibung
CURSOR_ALREADY_OPENORA_065511CURSOR ist schon geöffnet
DUP_VAL_ON_INDEXORA_00001Versuch, einen doppelten Wert in eine Spalte einzutragen, die einen eindeutigen Index hat
INVALID_CURSORORA_01001Nicht erlaubte CURSOR-Operation
INVALID_NUMBERORA-01722Konvertierung eines Strings in eine Zahl schlug fehl
LOGIN_DENIEDORA-01017Anmeldung an Datenbank nicht möglich
NO_DATA_FOUNDORA-01403SELECT hat keine Daten zurückgeliefert
OTHERS Steht für alle EXCEPTIONS, die nicht explizit im EXECPTION-Handler aufgeführt wurden. OTHERS kann nicht in einer LISTE von EXCEPTIONS erscheinen, sondern muß getrennt aufgeführt werden.
PROGRAMM_ERRORORA-06501Interner PL/SQL-Fehler
ROWTYPE_MISMATCHORA-06504Spalte und Variable haben nicht den gleichen Datentyp
STORAGE-ERRORORA-06500Bei Memory-Fehlern, z.B. wenn der Speicher zu klein ist
TIMEOUT_ON_RESOURCEORA-00051Meistens ist eine ORACLE-Instance abgestürzt
TOO_MANY_ROWSORA-01422SELECT, der einzeiliges Ergebnis liefern sollte, liefert mehrere Zeilen
VALUE_ERRORORA-06502Arithmetische Fehler, Konvertierungsfehler oder Zuweisungsfehler, z.B. Wert der eine Variablen zugewiesen wird, ist zu lang
ZERO_DIVIDEORA-01476Division durch Null

Beispiel:

Eine Prozedur zum Löschen des Lagerbestand für Teile:

   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, V