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





