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 legen eine Ausnahmeroutine im EXCEPTION-Abschnitt einer zusammengesetzten Anweisung fest. Weitere Hinweise finden Sie unter Zusammengesetzte Anweisungen verwenden.
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.
Die Demonstrationsprozeduren, die die Verarbeitungsroutine bei Ausnahmefehlern illustrieren, basieren auf jenen in Standard-Fehlerbehandlung in Prozeduren und Triggern.
In diesem Beispiel verarbeitet zusätzlicher Programmcode den Fehler Column not found (Spalte nicht gefunden) in der Prozedur InnerProc.
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(); |
Das Register 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 Anweisung RESIGNAL die Ausnahmebedingung an eine Ausnahmeroutine höherer Ebene. RESIGNAL ist die Standardmaßnahme, wenn WHEN OTHERS THEN in einer Ausnahmeroutine nicht angegeben wurde.
Der EXCEPTION-Handler wird ausgeführt, nicht die Zeilen nach der SIGNAL-Anweisung in InnerProc.
Da der Fehler vom Typ Column not found (Spalte nicht gefunden) ist, wird die MESSAGE-Anweisung ausgeführt, die für diesen Fehler vorgesehen war, und SQLSTATE wird auf 0 zurückgesetzt (d.h. also keine Fehlerbedingung).
Nachdem der Code für die Verarbeitungsroutine bei Ausnahmefehlern ausgeführt wurde, wird die Kontrolle zurück an die Prozedur OuterProc übertragen, die so weiter arbeitet, als wäre kein Fehler aufgetreten.
Sie dürfen ON EXCEPTION RESUME nicht gemeinsam mit expliziten Verarbeitungsroutinen bei Ausnahmefehlern verwenden. Der Code für die Verarbeitungsroutine bei Ausnahmefehlern wird nicht ausgeführt, wenn ON EXCEPTION RESUME in der Prozedur einprogrammiert ist.
Wenn der Code für die Fehlerbehandlung bei Column not found (Spalte nicht gefunden) einfach eine RESIGNAL-Anweisung ist, wird die Kontrolle an die Prozedur OuterProc zurückgegeben, wobei der SQLSTATE immer noch auf den Wert 52003 gesetzt ist. Dies ist genau so, als wäre in InnerProc kein Fehlerbehandlungscode vorhanden. Da sich in OuterProc kein Code für die Fehlerbehandlung befindet, schlägt die Prozedur fehl.
Wenn eine Ausnahmebedingung innerhalb einer zusammengesetzten Anweisung behandelt wird, schließt die zusammengesetzte Anweisung ohne aktive Ausnahmebedingung ab, und die Änderungen vor dem Eintritt der Ausnahmebedingung werden nicht zurückgesetzt. Dies gilt auch bei atomaren zusammengesetzten Anweisungen. Wenn ein Fehler in einer atomaren zusammengesetzten Anweisung auftritt und explizit verarbeitet wird, werden einige, aber nicht alle Anweisungen in der atomaren zusammengesetzten Anweisung ausgeführt.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |