Behandlung von Oracle PL / SQL-Ausnahmen: Beispiele zum Auslösen benutzerdefinierter Ausnahmen

Inhaltsverzeichnis:

Anonim

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 beispielsweise die PL / SQL-Engine eine Anweisung zum Teilen einer beliebigen Zahl durch '0' erhält, wird diese von der PL / SQL-Engine als Ausnahme ausgelöst. Die Ausnahme wird nur zur Laufzeit von der PL / SQL-Engine ausgelöst.

Ausnahmen verhindern, dass das Programm weiter ausgeführt wird. Um solche Bedingungen zu vermeiden, müssen sie separat erfasst und behandelt werden. Dieser Prozess wird als Ausnahmebehandlung bezeichnet, bei der der Programmierer die Ausnahme behandelt, die zur Laufzeit auftreten kann.

In diesem Tutorial lernen Sie die folgenden Themen:

  • Syntax zur Ausnahmebehandlung
  • Arten von Ausnahmen
  • Vordefinierte Ausnahmen
  • Benutzerdefinierte Ausnahme
  • PL / SQL-Auslöseausnahme
  • Wichtige Punkte, die in Ausnahme zu beachten sind

Syntax zur Ausnahmebehandlung

Ausnahmen werden auf Blockebene behandelt, dh wenn einmal eine Ausnahme in einem Block auftritt, wird das Steuerelement aus dem Ausführungsteil dieses Blocks herauskommen. Die Ausnahme wird dann im Ausnahmebehandlungsteil dieses Blocks behandelt. Nach der Behandlung der Ausnahme ist es nicht möglich, die Steuerung wieder an den Ausführungsabschnitt dieses Blocks zurückzusenden.

In der folgenden Syntax wird erläutert, wie die Ausnahme abgefangen und behandelt wird.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Syntax Erläuterung:

  • In der obigen Syntax enthält der Ausnahmebehandlungsblock eine Reihe von WHEN-Bedingungen, um die Ausnahme zu behandeln.
  • Auf jede WHEN-Bedingung folgt der Ausnahmename, der zur Laufzeit erwartet wird.
  • Wenn zur Laufzeit eine Ausnahme ausgelöst wird, sucht die PL / SQL-Engine im Teil zur Ausnahmebehandlung nach dieser bestimmten Ausnahme. Es beginnt mit der ersten 'WHEN'-Klausel und sucht nacheinander.
  • Wenn die Ausnahmebehandlung für die ausgelöste Ausnahme gefunden wurde, wird dieser bestimmte Teil des Behandlungscodes ausgeführt.
  • Wenn für die ausgelöste Ausnahme keine der 'WHEN'-Klauseln vorhanden ist, führt die PL / SQL-Engine den Teil' WHEN OTHERS 'aus (falls vorhanden). Dies ist für alle Ausnahmen gleich.
  • Nach dem Ausführen der Ausnahme verlässt die Teilesteuerung den aktuellen Block.
  • Zur Laufzeit kann nur ein Ausnahmeteil für einen Block ausgeführt werden. Nach der Ausführung überspringt der Controller den verbleibenden Teil der Ausnahmebehandlung und verlässt den aktuellen Block.

Hinweis: WENN ANDERE immer an der letzten Position der Sequenz sein sollten. Der nach WHEN OTHERS vorhandene Ausnahmebehandlungsteil wird niemals ausgeführt, da das Steuerelement nach Ausführung von WHEN OTHERS den Block verlässt.

Arten von Ausnahmen

Es gibt zwei Arten von Ausnahmen in 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' in Oracle definiert. Im Code können wir diesen vordefinierten Ausnahmennamen direkt verwenden, um sie zu behandeln.

Nachfolgend sind die wenigen vordefinierten Ausnahmen aufgeführt

Ausnahme 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 Verwenden von Erfassungsmethoden (außer EXISTS) oder Zugreifen auf Erfassungsattribute für nicht initialisierte Sammlungen
CURSOR_ALREADY_OPEN ORA-06511 Es wird versucht, einen bereits geöffneten Cursor zu öffnen
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 Anweisung 'SELECT', die die INTO-Klausel enthält, keine Zeilen abruft.
ROW_MISMATCH ORA-06504 Wenn der Datentyp der Cursor-Variablen nicht mit dem tatsächlichen Cursor-Rückgabetyp kompatibel ist
SUBSCRIPT_BEYOND_COUNT ORA-06533 Verweisen der Sammlung durch eine Indexnummer, die größer als die Sammlungsgröße ist
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Verweis auf die Sammlung durch eine 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, die größer als die Variablengröße ist)
ZERO_DIVIDE ORA-01476 Teilen einer Zahl durch '0'

Benutzerdefinierte Ausnahme

In Oracle kann der Programmierer außer den oben vordefinierten Ausnahmen eine 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;BEGINEXCEPTIONWHEN  THENEND;
  • In der obigen Syntax ist die Variable 'Ausnahmenname' als Typ 'AUSNAHME' definiert.
  • Dies kann ähnlich wie eine vordefinierte Ausnahme verwendet werden.

Syntax: Auf Paketspezifikationsebene

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • In der obigen Syntax wird die Variable 'Ausnahmenname' in der Paketspezifikation von als Typ 'AUSNAHME' definiert.
  • Dies kann in der Datenbank überall dort verwendet werden, wo das Paket 'Paketname' aufgerufen werden kann.

PL / SQL-Auslöseausnahme

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' im Programm separat 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 ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Syntax Erläuterung:

  • In der obigen Syntax wird das Schlüsselwort RAISE im Ausnahmebehandlungsblock verwendet.
  • Immer wenn das Programm auf die Ausnahme "Ausnahmenname" stößt, wird die Ausnahme behandelt und normal abgeschlossen
  • Das Schlüsselwort 'RAISE' im Teil zur Ausnahmebehandlung gibt diese bestimmte Ausnahme jedoch an das übergeordnete Programm weiter.

Hinweis: Während die Ausnahme für den übergeordneten Block ausgelöst wird, sollte die Ausnahme, die ausgelöst wird, auch für den übergeordneten Block sichtbar sein, da sonst oracle einen Fehler auslöst.

  • 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 ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Syntax Erläuterung:

  • In der obigen Syntax wird das Schlüsselwort RAISE im Ausführungsteil verwendet, gefolgt von der Ausnahme "Ausnahmename".
  • Dadurch wird diese spezielle Ausnahme zum Zeitpunkt der Ausführung ausgelöst, und dies muss behandelt oder weiter ausgelöst werden.

Beispiel 1 : In diesem Beispiel werden wir sehen

  • So deklarieren Sie die Ausnahme
  • So lösen Sie die deklarierte Ausnahme aus und
  • Wie man es an den Hauptblock weitergibt
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Code Erläuterung:

  • Codezeile 2 : Deklarieren der Variablen 'sample_exception' als EXCEPTION-Typ.
  • Codezeile 3 : Deklarieren der Prozedur nested_block.
  • Codezeile 6 : Drucken der Anweisung "Inside verschachtelter Block".
  • Codezeile 7: Drucken der Anweisung "Auslösen einer sample_exception aus einem verschachtelten Block".
  • 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 im verschachtelten Block erfasst. Anheben zum Hauptblock '.
  • Codezeile 12: Auslösen der Ausnahme zum Hauptblock (Weitergabe an den Hauptblock).
  • Codezeile 15: Drucken der Anweisung "Innerhalb des Hauptblocks".
  • Codezeile 16: Drucken der Anweisung "Verschachtelten Block aufrufen".
  • Codezeile 17: Aufruf der Prozedur nested_block.
  • Codezeile 19: Ausnahmehandler für sample_exception im Hauptblock.
  • Codezeile 20: Drucken der Anweisung "Ausnahme im Hauptblock erfasst".

Wichtige Punkte, die in Ausnahme zu beachten sind

  • In der Funktion sollte eine Ausnahme immer entweder einen Wert zurückgeben oder die Ausnahme weiter auslösen. Andernfalls gibt Oracle zur Laufzeit den Fehler "Funktion ohne Wert zurückgegeben" aus.
  • Transaktionssteuerungsanweisungen können im Ausnahmebehandlungsblock angegeben werden.
  • SQLERRM und SQLCODE sind die integrierten Funktionen, die die Ausnahmemeldung und den Ausnahmecode liefern.
  • 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 das Präfix "-" enthalten.

Zusammenfassung

Nach diesem Kapitel. Sie sollten in der Lage sein, für die folgenden Aspekte von Pl SQL-Ausnahmen zu arbeiten

  • Umgang mit den Ausnahmen
  • Definieren Sie eine Ausnahme
  • Die Ausnahme auslösen
  • Ausnahmeverbreitung