Ausnahmebehandlung in Oracle PL/SQL (Beispiele)
⚡ Intelligente Zusammenfassung
Ausnahmebehandlung in Oracle PL/SQL fängt Laufzeitfehler ab, die die Ausführung eines Blocks verhindern, und ermöglicht es der Engine, die Kontrolle an einen EXCEPTION-Abschnitt zu übertragen, in dem vordefinierte, benutzerdefinierte und OTHERS-Handler auf Fehler reagieren, diese auslösen oder sicher weitergeben.

Was ist Ausnahmebehandlung in PL/SQL?
Eine Ausnahme tritt auf, wenn die PL/SQL-Engine auf eine Anweisung stößt, die sie aufgrund eines Laufzeitfehlers nicht ausführen kann. Diese Fehler werden nicht zur Kompilierzeit erkannt und müssen daher erst zur Laufzeit behandelt werden.
Wenn die PL/SQL-Engine beispielsweise die Anweisung erhält, eine Zahl durch Null zu teilen, löst sie eine Ausnahme aus. Diese Ausnahme wird von der PL/SQL-Engine erst zur Laufzeit ausgelöst.
Eine Ausnahme stoppt die weitere Programmausführung. Um dies zu vermeiden, muss der Fehler abgefangen und separat behandelt werden. Dieser Vorgang wird als Ausnahmebehandlung bezeichnet. Dabei kümmert sich der Programmierer um Fehler, die zur Laufzeit auftreten können.
Ausnahmebehandlungssyntax
Ausnahmen werden auf Blockebene behandelt. Tritt in einem Block eine Ausnahme auf, verlässt die Programmausführung den Ausführungsteil dieses Blocks, und die Ausnahme wird anschließend im Ausnahmebehandlungsteil des Blocks behandelt. Nach der Behandlung der Ausnahme kann die Programmausführung nicht mehr zum selben Block zurückkehren.
Die folgende Abbildung zeigt, wie der Ausführungsabschnitt und der Abschnitt zur Ausnahmebehandlung in einem einzigen PL/SQL-Block angeordnet sind:
Die folgende Syntax erklärt, wie man eine Ausnahme abfängt und behandelt.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Syntaxerklärung:
- In der obigen Syntax enthält der Ausnahmebehandlungsblock eine Reihe von WHEN-Bedingungen zur Behandlung von Ausnahmen.
- Auf jede WHEN-Bedingung folgt ein Ausnahmename, der voraussichtlich zur Laufzeit ausgelöst wird.
- Wenn zur Laufzeit eine Ausnahme auftritt, durchsucht die PL/SQL-Engine den Ausnahmebehandlungsteil nach dieser speziellen Ausnahme, beginnend mit der ersten WHEN-Klausel und sequenziell vorgehend.
- Wenn ein passender Behandlungsmechanismus für die aufgetretene Ausnahme gefunden wird, wird dieser spezielle Behandlungscode ausgeführt.
- Wenn keine WHEN-Klausel auf die ausgelöste Ausnahme zutrifft, führt die PL/SQL-Engine den WHEN OTHERS-Teil aus, sofern vorhanden. Diese Ausnahmebehandlung gilt für alle Ausnahmen.
- Nach Ausführung des Handlers verlässt die Steuerung den aktuellen Block.
- Zur Laufzeit kann für einen Block nur ein Ausnahmebehandler ausgeführt werden. Nach dessen Ausführung überspringt die Engine die übrigen Behandler und verlässt den aktuellen Block.
Hinweis: WHEN OTHERS sollte immer als letzte Anweisung in der Sequenz stehen. Jeder nach WHEN OTHERS geschriebene Handler wird nie ausgeführt, da die Ausführung den Block verlässt, sobald WHEN OTHERS ausgeführt wurde.
Arten von Ausnahmen
Es gibt zwei Arten von Ausnahmen in PL / SQL.
- Vordefinierte Ausnahmen
- Benutzerdefinierte Ausnahmen
Vordefinierte Ausnahmen
Oracle hat einige häufige Ausnahmen vordefiniert. Jede vordefinierte Ausnahme hat einen eindeutigen Namen und eine eindeutige Fehlernummer, und alle sind im Paket STANDARD deklariert. OracleIm Code können Sie diese vordefinierten Ausnahmenamen direkt verwenden, um die entsprechenden Fehler zu behandeln. Viele davon lassen sich direkt gängigen Ausnahmen zuordnen. SQL Fehler, denen man jeden Tag begegnet.
Nachfolgend sind einige vordefinierte Ausnahmen aufgeführt:
| Exception | Fehler Code | Ausnahmegrund |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Den Attributen eines nicht initialisierten Objekts einen Wert zuweisen |
| CASE_NOT_FOUND | ORA-06592 | Keine der WHEN-Klauseln in einer CASE-Anweisung ist erfüllt und es ist keine ELSE-Klausel angegeben. |
| COLLECTION_IS_NULL | ORA-06531 | Die Verwendung von Sammlungsmethoden (mit Ausnahme von EXISTS) oder der Zugriff auf Sammlungsattribute einer nicht initialisierten Sammlung |
| CURSOR_ALREADY_OPEN | ORA-06511 | Versuche eine zu öffnen Cursor das bereits geöffnet ist |
| DUP_VAL_ON_INDEX | ORA-00001 | Speichern eines doppelten Werts in einer Datenbankspalte, die durch einen eindeutigen Index eingeschränkt ist |
| INVALID_CURSOR | ORA-01001 | Unzulässige Cursoroperationen, wie beispielsweise das Schließen eines noch nicht geöffneten Cursors |
| UNGÜLTIGE NUMMER | ORA-01722 | Die Umwandlung eines Zeichens in eine Zahl ist aufgrund eines ungültigen numerischen Zeichens fehlgeschlagen. |
| KEINE DATEN GEFUNDEN | ORA-01403 | Eine SELECT-Anweisung, die eine INTO-Klausel enthält, ruft keine Zeilen ab. |
| ROW_MISMATCH | ORA-06504 | Der Datentyp der Cursorvariablen ist mit dem tatsächlichen Rückgabetyp des Cursors inkompatibel. |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Auf eine Sammlung anhand einer Indexnummer verweisen, die größer als die Sammlungsgröße ist |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Bezugnahme auf eine Sammlung anhand einer Indexnummer außerhalb des zulässigen Bereichs (z. B. -1) |
| TOO_MANY_ROWS | ORA-01422 | Eine SELECT-Anweisung mit einer INTO-Klausel gibt mehr als eine Zeile zurück. |
| VALUE_ERROR | ORA-06502 | Ein Rechenfehler oder ein Fehler aufgrund einer Größenbeschränkung (z. B. die Zuweisung eines Wertes, der größer ist als die Größe der Variablen). |
| ZERO_DIVIDE | ORA-01476 | Eine Zahl durch Null teilen |
Benutzerdefinierte Ausnahme
Neben den oben genannten vordefinierten Ausnahmen kann ein Programmierer benutzerdefinierte Ausnahmen erstellen und behandeln. Diese werden auf Unterprogrammebene im Deklarationsteil definiert und sind nur innerhalb dieses Unterprogramms sichtbar. Eine in einer Paketspezifikation definierte Ausnahme ist eine öffentliche Ausnahme und überall dort sichtbar, wo auf das Paket zugegriffen werden kann.
Syntax: Auf Unterprogrammebene
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- In der obigen Syntax ist die Variable 'exception_name' als EXCEPTION-Typ definiert.
- Sie kann dann auf die gleiche Weise wie eine vordefinierte Ausnahme verwendet werden.
Syntax: Auf Ebene der Paketspezifikation
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- In der obigen Syntax ist die Variable 'exception_name' als EXCEPTION-Typ in der Paketspezifikation definiert. Die
- Es kann in der gesamten Datenbank überall dort verwendet werden, wo das Paket 'package_name' aufgerufen werden kann.
PL/SQL-Raise-Ausnahme
Alle vordefinierten Ausnahmen werden implizit ausgelöst, sobald der entsprechende Fehler auftritt. Benutzerdefinierte Ausnahmen müssen hingegen explizit mit dem Schlüsselwort RAISE ausgelöst werden. RAISE kann wie unten gezeigt verwendet werden.
Wird RAISE innerhalb eines Ausnahmebehandlers allein verwendet, wird die bereits ausgelöste Ausnahme an den übergeordneten Block weitergegeben. Es kann nur innerhalb eines Ausnahmeblocks verwendet werden, wie unten gezeigt.
Der folgende Screenshot zeigt die alleinige Verwendung von RAISE, um eine Ausnahme im umschließenden Block erneut auszulösen:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Syntaxerklärung:
- In der obigen Syntax wird das Schlüsselwort RAISE innerhalb des Ausnahmebehandlungsblocks verwendet.
- Wenn das Programm auf die Ausnahme 'exception_name' stößt, wird die Ausnahme behandelt und das Programm normal beendet.
- Das Schlüsselwort RAISE im Handler leitet diese Ausnahme dann an das übergeordnete Programm weiter.
Hinweis: Wenn eine Ausnahme im übergeordneten Block ausgelöst wird, muss die ausgelöste Ausnahme auch im übergeordneten Block sichtbar sein; andernfalls Oracle wirft einen Fehler.
Sie können auch das Schlüsselwort RAISE gefolgt von einem Ausnahmenamen verwenden, um die entsprechende benutzerdefinierte oder vordefinierte Ausnahme auszulösen. Diese Form kann sowohl im Ausführungsteil als auch im Ausnahmebehandlungsteil verwendet werden.
Der folgende Screenshot zeigt RAISE gefolgt von einem Ausnahmenamen, um eine bestimmte Ausnahme auszulösen:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Syntaxerklärung:
- In der obigen Syntax wird im Ausführungsteil das Schlüsselwort RAISE verwendet, gefolgt von der Ausnahme 'exception_name'.
- Dies löst zur Laufzeit genau diese Ausnahme aus, die dann behandelt oder weiter ausgelöst werden muss.
Beispiel 1: In diesem Beispiel werden wir Folgendes sehen:
- Wie man eine Ausnahme deklariert
- Wie kann die deklarierte Ausnahme ausgelöst werden?
- So verbreiten Sie es an den Hauptblock
Der folgende Screenshot zeigt den vollständigen Block, der sample_exception deklariert, sie innerhalb eines verschachtelten Blocks auslöst und sie an den Hauptblock weitergibt:
Der folgende Screenshot zeigt dasselbe Beispiel in Fortsetzung, wobei der Hauptblock schließlich die weitergegebene Ausnahme abfängt:
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line('Inside nested block'); Dbms_output.put_line('Raising sample_exception from nested block'); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in nested block. Raising to main block'); RAISE; END; BEGIN Dbms_output.put_line('Inside main block'); Dbms_output.put_line('Calling nested block'); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in main block'); END; /
Code Erläuterung:
- Code Zeile 2: Die Variable 'sample_exception' wird als EXCEPTION-Typ deklariert.
- Code Zeile 3: Deklaration der Prozedur nested_block.
- Code Zeile 6: Die Anweisung „Innerhalb eines verschachtelten Blocks“ wird ausgegeben.
- Code Zeile 7: Die Anweisung „Ausnahme „sample_exception“ aus verschachteltem Block wird ausgegeben“ wird ausgegeben.
- Code Zeile 8: Auslösen der Ausnahme mit „RAISE sample_Exception“.
- Code Zeile 10: Ausnahmebehandlung für die Ausnahme sample_exception im verschachtelten Block.
- Code Zeile 11: Die Meldung „Ausnahme im verschachtelten Block abgefangen. Weiterleitung an den Hauptblock“ wird ausgegeben.
- Code Zeile 12: Die Ausnahme wird an den Hauptblock weitergeleitet (und somit weitergegeben).
- Code Zeile 15: Die Aussage „Im Hauptblock“ wird ausgegeben.
- Code Zeile 16: Drucken der Anweisung „Aufruf verschachtelter Blöcke“.
- Code Zeile 17: Aufruf der Prozedur nested_block.
- Code Zeile 19: Ausnahmehandler für sample_Exception im Hauptblock.
- Code Zeile 20: Die Meldung „Ausnahme im Hauptblock erfasst“ wird ausgegeben.
Wichtige Punkte, die Sie in der Ausnahme beachten sollten
- In einer Funktion sollte eine Ausnahme immer entweder einen Wert zurückgeben oder die Ausnahme weiter auslösen; andernfalls Oracle Wirft zur Laufzeit einen Fehler der Art „Funktion ohne Wert zurückgegeben“.
- Transaktionskontrollanweisungen kann innerhalb des Ausnahmebehandlungsblocks ausgegeben werden.
- SQLERRM und SQLCODE sind integrierte Funktionen, die die Fehlermeldung bzw. den Ausnahmecode zurückgeben.
- Wird eine Ausnahme nicht behandelt, werden standardmäßig alle aktiven Transaktionen in dieser Sitzung zurückgesetzt.
- RAISE_APPLICATION_ERROR (- , ) kann anstelle von RAISE verwendet werden, um einen Fehler mit einem benutzerdefinierten Code und einer benutzerdefinierten Meldung auszulösen. Der Fehlercode muss zwischen -20000 und -20999 liegen.





