Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Gespeicherte Prozeduren, Trigger, Batches und benutzerdefinierte Funktionen » Behandlung von Fehlern und Warnungen

 

Ausnahmeroutinen

Oft will man bestimmte Fehlertypen abfangen und in einer Prozedur oder einem Trigger behandeln, anstatt den Fehler an die aufrufende Umgebung zurückzugeben. Dies erfolgt durch eine Ausnahmeroutine.

Sie können eine Ausnahmeroutine im EXCEPTION-Teil einer zusammengesetzten Anweisung festlegen.

Die Ausnahmeroutine wird ausgeführt, wenn ein Fehler in der zusammengesetzten Anweisung auftritt. Im Gegensatz zu Fehlern führen Warnungen nicht dazu, dass der Programmcode der Ausnahmefehler-Verarbeitungsroutine ausgeführt wird. Der Code der Verarbeitungsroutine bei Ausnahmefehlern wird auch ausgeführt, wenn ein Fehler in einer verschachtelten zusammengesetzten Anweisung oder in einer Prozedur bzw. einem Trigger erscheint, die irgendwo in der zusammengesetzten Anweisung aufgerufen wurden.

Eine Ausnahmeroutine für den Unterbrechungsfehler SQL_INTERRUPT, SQLSTATE 57014 sollte ausschließlich nicht unterbrechbare Anweisungen wie ROLLBACK und ROLLBACK TO SAVEPOINT enthalten. Wenn die Ausnahmeroutine unterbrechbare Anweisungen enthält, die aufgerufen werden, wenn die Verbindung unterbrochen wird, stoppt der Datenbankserver die Ausnahmeroutine bei der ersten unterbrechbaren Anweisung und gibt einen Fehler zurück.

Eine Ausnahmeroutine kann mit den SQLSTATE- oder SQLCODE-Spezialwerten ermitteln, warum eine Anweisung fehlgeschlagen ist. Alternativ dazu kann die Funktion ERRORMSG ohne Argument verwendet werden, um die Fehlerbedingung für SQLSTATE zurückzugeben. Nur die erste Anweisung jeder WHEN-Klausel kann diese Informationen festlegen und die Anweisung kann keine zusammengesetzte Anweisung sein.

Die Demonstrationsprozeduren, die die Verarbeitungsroutine bei Ausnahmefehlern illustrieren, basieren auf jenen in Standardmäßige Behandlung von Fehlern.

In diesem Beispiel verarbeitet zusätzlicher Code den Fehler in der InnerProc-Prozedur bezüglich der Spalte, die nicht gefunden werden kann.



DROP PROCEDURE OuterProc;
DROP PROCEDURE InnerProc;

CREATE PROCEDURE OuterProc()
BEGIN
   MESSAGE 'Hello from OuterProc.' TO CLIENT;
   CALL InnerProc();
   MESSAGE 'SQLSTATE set to ',
      SQLSTATE,' in OuterProc.' TO CLIENT
END;
CREATE PROCEDURE InnerProc()
BEGIN
   DECLARE column_not_found
    EXCEPTION FOR SQLSTATE '52003';
   MESSAGE 'Hello from InnerProc.' TO CLIENT;
  SIGNAL column_not_found;
  MESSAGE 'Line following SIGNAL.' TO CLIENT;
   EXCEPTION
      WHEN column_not_found THEN
        MESSAGE 'Column not found handling.' TO CLIENT;
      WHEN OTHERS THEN
        RESIGNAL ;
END;

CALL OuterProc();

Die Registerkarte Meldungen von Interactive SQL zeigt Folgendes an:

Hello from OuterProc.
Hello from InnerProc.
Column not found handling.
SQLSTATE set to 00000 in OuterProc.

Die EXCEPTION-Klausel deklariert die Ausnahmeroutine. Die der EXCEPTION-Klausel folgenden Zeilen werden nur ausgeführt, wenn ein Fehler auftritt. Jede WHEN-Klausel gibt einen Namen für eine Ausnahmebedingung (deklariert mit einer DECLARE-Anweisung) sowie die Anweisung oder die Anweisungen an, die beim Eintreten des Ausnahmefehlers ausgeführt werden sollen. Die Klausel WHEN OTHERS THEN gibt die Anweisungen an, die ausgeführt werden sollen, wenn die aufgetretene Ausnahmebedingung in den vorhergehenden WHEN-Klauseln nicht vorkommt.

In diesem Beispiel übergibt die RESIGNAL-Anweisung die Ausnahmebedingung an eine Ausnahmeroutine einer höheren Ebene. RESIGNAL ist die Standardmaßnahme, wenn WHEN OTHERS THEN in einer Ausnahmeroutine nicht angegeben wurde.

 Weitere Hinweise
 Routine bei Ausnahmefehlern und atomare zusammengesetzte Anweisungen
 Siehe auch