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.

Ausnahmebehandlung in PL/SQL

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.

  1. Vordefinierte Ausnahmen
  2. 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.

PL/SQL-Raise-Ausnahme

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.

PL/SQL-Raise-Ausnahme

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

PL/SQL-Raise-Ausnahme

PL/SQL-Raise-Ausnahme

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

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: