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