Ausnahmebehandlung in Oracle PL/SQL (Beispiele)
Was ist Ausnahmebehandlung in PL/SQL?
Eine Ausnahme tritt auf, wenn die PL/SQL-Engine auf eine Anweisung stößt, die sie aufgrund eines zur Laufzeit auftretenden Fehlers nicht ausführen kann. Diese Fehler werden zum Zeitpunkt der Kompilierung nicht erfasst und müssen daher nur zur Laufzeit behandelt werden.
Wenn die PL/SQL-Engine beispielsweise eine Anweisung erhält, eine beliebige Zahl durch „0“ zu dividieren, löst die PL/SQL-Engine dies als Ausnahme aus. Die Ausnahme wird nur zur Laufzeit von der PL/SQL-Engine ausgelöst.
Ausnahmen verhindern die weitere Ausführung des Programms. Um solche Bedingungen zu vermeiden, müssen sie daher separat erfasst und behandelt werden. Dieser Prozess wird als Ausnahmebehandlung bezeichnet. Dabei behandelt der Programmierer die Ausnahme, die zur Laufzeit auftreten kann.
Ausnahmebehandlungssyntax
Ausnahmen werden auf Blockebene behandelt, d. h. sobald in einem Block eine Ausnahme auftritt, verlässt die Steuerung den Ausführungsteil dieses Blocks. Die Ausnahme wird dann im Ausnahmebehandlungsteil dieses Blocks behandelt. Nach der Behandlung der Ausnahme ist es nicht möglich, die Kontrolle erneut an den Ausführungsabschnitt dieses Blocks zu senden.
Die folgende Syntax erläutert, wie die Ausnahme abgefangen und behandelt wird.
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 der Ausnahme.
- Auf jede WHEN-Bedingung folgt der Ausnahmename, der zur Laufzeit voraussichtlich ausgelöst wird.
- Wenn zur Laufzeit eine Ausnahme ausgelöst wird, sucht die PL/SQL-Engine im Abschnitt zur Ausnahmebehandlung nach dieser bestimmten Ausnahme. Es beginnt mit der ersten „WHEN“-Klausel und führt der Reihe nach eine Suche durch.
- Wenn die Ausnahmebehandlung für die ausgelöste Ausnahme gefunden wurde, führt sie diesen speziellen Behandlungscodeteil aus.
- Wenn keine der „WHEN“-Klauseln für die ausgelöste Ausnahme vorhanden ist, führt die PL/SQL-Engine den „WHEN OTHERS“-Teil aus (falls vorhanden). Dies gilt für alle Ausnahmen.
- Nach Ausführung der Ausnahme verlässt die Teilekontrolle den aktuellen Block.
- Für einen Block kann zur Laufzeit nur ein Ausnahmeteil ausgeführt werden. Nach der Ausführung überspringt der Controller den verbleibenden Teil der Ausnahmebehandlung und verlässt den aktuellen Block.
Hinweis: WHEN OTHERS sollte immer an der letzten Position der Sequenz stehen. Der nach WHEN OTHERS vorhandene Ausnahmebehandlungsteil wird nie ausgeführt, da die Steuerung den Block nach der Ausführung von WHEN OTHERS verlässt.
Arten von Ausnahmen
Es gibt zwei Arten von Ausnahmen Pl/SQL.
- Vordefinierte Ausnahmen
- Benutzerdefinierte Ausnahme
Vordefinierte Ausnahmen
Oracle hat einige häufige Ausnahmen vordefiniert. Diese Ausnahmen haben einen eindeutigen Ausnahmenamen und eine eindeutige Fehlernummer. Diese Ausnahmen sind bereits im Paket „STANDARD“ definiert Oracle. Im Code können wir diese vordefinierten Ausnahmenamen direkt verwenden, um sie zu behandeln.
Nachfolgend sind die wenigen vordefinierten Ausnahmen aufgeführt
Exception | Fehlercode | Ausnahmegrund |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Weisen Sie den Attributen nicht initialisierter Objekte einen Wert zu |
CASE_NOT_FOUND | ORA-06592 | Keine der „WHEN“-Klauseln in der CASE-Anweisung ist erfüllt und es ist keine „ELSE“-Klausel angegeben |
COLLECTION_IS_NULL | ORA-06531 | Verwendung von Sammlungsmethoden (außer EXISTS) oder Zugriff auf Sammlungsattribute für nicht initialisierte Sammlungen |
CURSOR_ALREADY_OPEN | ORA-06511 | Versuche eine zu öffnen Cursor welches 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 das Schließen eines ungeöffneten Cursors |
UNGÜLTIGE NUMMER | ORA-01722 | Die Konvertierung des Zeichens in eine Zahl ist aufgrund eines ungültigen Zahlenzeichens fehlgeschlagen |
KEINE DATEN GEFUNDEN | ORA-01403 | Wenn die SELECT-Anweisung, die die INTO-Klausel enthält, keine Zeilen abruft. |
ROW_MISMATCH | ORA-06504 | Wenn der Datentyp der Cursorvariablen nicht mit dem tatsächlichen Rückgabetyp des Cursors kompatibel ist |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Verweisen auf die Sammlung durch eine Indexnummer, die größer als die Sammlungsgröße ist |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Verweisende Sammlung anhand einer Indexnummer, die außerhalb des zulässigen Bereichs liegt (z. B. -1) |
TOO_MANY_ROWS | ORA-01422 | Wenn eine „SELECT“-Anweisung mit INTO-Klausel mehr als eine Zeile zurückgibt |
VALUE_ERROR | ORA-06502 | Arithmetik- oder Größenbeschränkungsfehler (z. B. Zuweisen eines Werts zu einer Variablen, der größer als die Variablengröße ist) |
ZERO_DIVIDE | ORA-01476 | Eine Zahl durch „0“ dividieren |
Benutzerdefinierte Ausnahme
In OracleAbgesehen von den oben vordefinierten Ausnahmen kann der Programmierer seine eigene Ausnahme erstellen und diese behandeln. Sie können auf Unterprogrammebene im Deklarationsteil erstellt werden. Diese Ausnahmen sind nur in diesem Unterprogramm sichtbar. Die in der 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 Typ „EXCEPTION“ definiert.
- Dies kann in ähnlicher Weise wie eine vordefinierte Ausnahme verwendet werden.
Syntax:Auf Paketspezifikationsebene
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- In der obigen Syntax ist die Variable „Exception_Name“ als Typ „EXCEPTION“ in der Paketspezifikation von definiert .
- Dies kann in der Datenbank überall dort verwendet werden, wo das Paket „Paketname“ aufgerufen werden kann.
PL/SQL-Raise-Ausnahme
Alle vordefinierten Ausnahmen werden implizit ausgelöst, wenn der Fehler auftritt. Die benutzerdefinierten Ausnahmen müssen jedoch explizit ausgelöst werden. Dies kann mit dem Schlüsselwort „RAISE“ erreicht werden. Dies kann auf eine der unten genannten Arten verwendet werden.
Wenn „RAISE“ separat im Programm verwendet wird, wird die bereits ausgelöste Ausnahme an den übergeordneten Block weitergegeben. Nur im Ausnahmeblock kann wie unten gezeigt verwendet werden.
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 im Ausnahmebehandlungsblock verwendet.
- Immer wenn das Programm auf die Ausnahme „Ausnahmename“ stößt, wird die Ausnahme behandelt und normal abgeschlossen
- Aber das Schlüsselwort „RAISE“ im Ausnahmebehandlungsteil gibt diese spezielle Ausnahme an das übergeordnete Programm weiter.
Hinweis: Während die Ausnahme im übergeordneten Block ausgelöst wird, sollte die ausgelöste Ausnahme auch im übergeordneten Block sichtbar sein, sonst gibt Oracle einen Fehler aus.
- Wir können das Schlüsselwort „RAISE“ gefolgt vom Ausnahmenamen verwenden, um diese bestimmte benutzerdefinierte/vordefinierte Ausnahme auszulösen. Dies kann sowohl im Ausführungsteil als auch im Ausnahmebehandlungsteil verwendet werden, um die 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“.
- Dadurch wird zum Zeitpunkt der Ausführung diese spezielle Ausnahme ausgelöst, die behandelt oder weiter ausgelöst werden muss.
Beispiel 1: In diesem Beispiel werden wir sehen
- So deklarieren Sie die Ausnahme
- So lösen Sie die deklarierte Ausnahme aus und
- So verbreiten Sie es an den Hauptblock
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-Erklärung:
- Codezeile 2: Deklaration der Variablen „sample_Exception“ als EXCEPTION-Typ.
- Codezeile 3: Prozedur nested_block deklarieren.
- Codezeile 6: Drucken der Anweisung „Innerhalb des verschachtelten Blocks“.
- Codezeile 7: Drucken der Anweisung „Sample_Exception aus verschachteltem Block auslösen.“
- Codezeile 8: Auslösen der Ausnahme mit „RAISE sample_Exception“.
- Codezeile 10: Ausnahmehandler für die Ausnahme „sample_Exception“ im verschachtelten Block.
- Codezeile 11: Drucken der Anweisung „Ausnahme in verschachteltem Block erfasst.“ Anheben zum Hauptblock.
- Codezeile 12: Auslösen der Ausnahme für den Hauptblock (Weitergabe an den Hauptblock).
- Codezeile 15: Drucken der Anweisung „Im Hauptblock“.
- Codezeile 16: Drucken der Anweisung „Aufruf verschachtelter Blöcke“.
- Codezeile 17: Aufruf der Prozedur „nested_block“.
- Codezeile 18: Exception
- Codezeile 19: Ausnahmehandler für sample_Exception im Hauptblock.
- Codezeile 20: Drucken der Anweisung „Im Hauptblock erfasste Ausnahme.“
Wichtige Punkte, die Sie in der Ausnahme beachten sollten
- In der Funktion sollte eine Ausnahme immer entweder einen Wert zurückgeben oder die Ausnahme weiter auslösen. anders Oracle löst zur Laufzeit den Fehler „Funktion ohne Wert zurückgegeben“ aus.
- Im Ausnahmebehandlungsblock können Transaktionskontrollanweisungen angegeben werden.
- SQLERRM und SQLCODE sind die integrierten Funktionen, die die Ausnahmemeldung und den Code ausgeben.
- Wenn eine Ausnahme nicht behandelt wird, werden standardmäßig alle aktiven Transaktionen in dieser Sitzung zurückgesetzt.
- RAISE_APPLICATION_ERROR (- , ) kann anstelle von RAISE verwendet werden, um den Fehler mit Benutzercode und Nachricht auszulösen. Der Fehlercode sollte größer als 20000 sein und ein „-“ voranstellen.
Zusammenfassung
Nach diesem Kapitel sollten Sie in der Lage sein, die folgenden Aspekte von PL zu bearbeiten. SQL Ausnahmen
- Umgang mit den Ausnahmen
- Definieren Sie eine Ausnahme
- Lösen Sie die Ausnahme aus
- Ausnahmeweitergabe