Ausnahmebehandlung in Oracle PL/SQL (Beispiele)

⚡ Intelligente Zusammenfassung

Ausnahmebehandlung in Oracle PL/SQL fängt Laufzeitfehler ab, die die Ausführung eines Blocks verhindern, und ermöglicht es der Engine, die Kontrolle an einen EXCEPTION-Abschnitt zu übertragen, in dem vordefinierte, benutzerdefinierte und OTHERS-Handler auf Fehler reagieren, diese auslösen oder sicher weitergeben.

  • ⚙️ Laufzeitfehler: Eine Ausnahme tritt auf, wenn die PL/SQL-Engine auf eine Anweisung stößt, die sie nicht ausführen kann, wie beispielsweise die Division einer Zahl durch Null.
  • 🧱 Blockstruktur: Ausnahmen werden im Abschnitt EXCEPTION mithilfe von WHEN-Klauseln behandelt, wobei WHEN OTHERS immer zuletzt steht.
  • 📚 Vordefinierte Ausnahmen: Oracle Benennt häufige Fehler wie NO_DATA_FOUND und ZERO_DIVIDE im STANDARD-Paket, sodass diese direkt abgefangen werden können.
  • Benutzerdefinierte Ausnahmen: Programmierer deklarieren ihre eigenen EXCEPTION-Variablen und lösen diese explizit mit dem Schlüsselwort RAISE aus.
  • ⬆️ Vermehrung: Eine unbehandelte Ausnahme wird an den umschließenden Block weitergegeben und durch RAISE an ein übergeordnetes Programm erneut signalisiert.
  • 🤖 KI-Unterstützung: KI-Codierungswerkzeuge entwerfen EXCEPTION-Blöcke und kennzeichnen unbehandelte Fehlerpfade während der Überprüfung.

Ausnahmebehandlung in Oracle PL / SQL

Was ist Ausnahmebehandlung in PL/SQL?

Eine Ausnahme tritt auf, wenn die PL/SQL-Engine auf eine Anweisung stößt, die sie aufgrund eines Laufzeitfehlers nicht ausführen kann. Diese Fehler werden nicht zur Kompilierzeit erkannt und müssen daher erst zur Laufzeit behandelt werden.

Wenn die PL/SQL-Engine beispielsweise die Anweisung erhält, eine Zahl durch Null zu teilen, löst sie eine Ausnahme aus. Diese Ausnahme wird von der PL/SQL-Engine erst zur Laufzeit ausgelöst.

Eine Ausnahme stoppt die weitere Programmausführung. Um dies zu vermeiden, muss der Fehler abgefangen und separat behandelt werden. Dieser Vorgang wird als Ausnahmebehandlung bezeichnet. Dabei kümmert sich der Programmierer um Fehler, die zur Laufzeit auftreten können.

Ausnahmebehandlungssyntax

Ausnahmen werden auf Blockebene behandelt. Tritt in einem Block eine Ausnahme auf, verlässt die Programmausführung den Ausführungsteil dieses Blocks, und die Ausnahme wird anschließend im Ausnahmebehandlungsteil des Blocks behandelt. Nach der Behandlung der Ausnahme kann die Programmausführung nicht mehr zum selben Block zurückkehren.

Die folgende Abbildung zeigt, wie der Ausführungsabschnitt und der Abschnitt zur Ausnahmebehandlung in einem einzigen PL/SQL-Block angeordnet sind:

Struktur eines PL/SQL-Blocks mit Ausführungs- und Ausnahmebehandlungsabschnitt

Die folgende Syntax erklärt, wie man eine Ausnahme abfängt und behandelt.

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 von Ausnahmen.
  • Auf jede WHEN-Bedingung folgt ein Ausnahmename, der voraussichtlich zur Laufzeit ausgelöst wird.
  • Wenn zur Laufzeit eine Ausnahme auftritt, durchsucht die PL/SQL-Engine den Ausnahmebehandlungsteil nach dieser speziellen Ausnahme, beginnend mit der ersten WHEN-Klausel und sequenziell vorgehend.
  • Wenn ein passender Behandlungsmechanismus für die aufgetretene Ausnahme gefunden wird, wird dieser spezielle Behandlungscode ausgeführt.
  • Wenn keine WHEN-Klausel auf die ausgelöste Ausnahme zutrifft, führt die PL/SQL-Engine den WHEN OTHERS-Teil aus, sofern vorhanden. Diese Ausnahmebehandlung gilt für alle Ausnahmen.
  • Nach Ausführung des Handlers verlässt die Steuerung den aktuellen Block.
  • Zur Laufzeit kann für einen Block nur ein Ausnahmebehandler ausgeführt werden. Nach dessen Ausführung überspringt die Engine die übrigen Behandler und verlässt den aktuellen Block.

Hinweis: WHEN OTHERS sollte immer als letzte Anweisung in der Sequenz stehen. Jeder nach WHEN OTHERS geschriebene Handler wird nie ausgeführt, da die Ausführung den Block verlässt, sobald WHEN OTHERS ausgeführt wurde.

Arten von Ausnahmen

Es gibt zwei Arten von Ausnahmen in PL / SQL.

  • Vordefinierte Ausnahmen
  • Benutzerdefinierte Ausnahmen

Vordefinierte Ausnahmen

Oracle hat einige häufige Ausnahmen vordefiniert. Jede vordefinierte Ausnahme hat einen eindeutigen Namen und eine eindeutige Fehlernummer, und alle sind im Paket STANDARD deklariert. OracleIm Code können Sie diese vordefinierten Ausnahmenamen direkt verwenden, um die entsprechenden Fehler zu behandeln. Viele davon lassen sich direkt gängigen Ausnahmen zuordnen. SQL Fehler, denen man jeden Tag begegnet.

Nachfolgend sind einige vordefinierte Ausnahmen aufgeführt:

Exception Fehler Code Ausnahmegrund
ACCESS_INTO_NULL ORA-06530 Den Attributen eines nicht initialisierten Objekts einen Wert zuweisen
CASE_NOT_FOUND ORA-06592 Keine der WHEN-Klauseln in einer CASE-Anweisung ist erfüllt und es ist keine ELSE-Klausel angegeben.
COLLECTION_IS_NULL ORA-06531 Die Verwendung von Sammlungsmethoden (mit Ausnahme von EXISTS) oder der Zugriff auf Sammlungsattribute einer nicht initialisierten Sammlung
CURSOR_ALREADY_OPEN ORA-06511 Versuche eine zu öffnen Cursor das 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 beispielsweise das Schließen eines noch nicht geöffneten Cursors
UNGÜLTIGE NUMMER ORA-01722 Die Umwandlung eines Zeichens in eine Zahl ist aufgrund eines ungültigen numerischen Zeichens fehlgeschlagen.
KEINE DATEN GEFUNDEN ORA-01403 Eine SELECT-Anweisung, die eine INTO-Klausel enthält, ruft keine Zeilen ab.
ROW_MISMATCH ORA-06504 Der Datentyp der Cursorvariablen ist mit dem tatsächlichen Rückgabetyp des Cursors inkompatibel.
SUBSCRIPT_BEYOND_COUNT ORA-06533 Auf eine Sammlung anhand einer Indexnummer verweisen, die größer als die Sammlungsgröße ist
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Bezugnahme auf eine Sammlung anhand einer Indexnummer außerhalb des zulässigen Bereichs (z. B. -1)
TOO_MANY_ROWS ORA-01422 Eine SELECT-Anweisung mit einer INTO-Klausel gibt mehr als eine Zeile zurück.
VALUE_ERROR ORA-06502 Ein Rechenfehler oder ein Fehler aufgrund einer Größenbeschränkung (z. B. die Zuweisung eines Wertes, der größer ist als die Größe der Variablen).
ZERO_DIVIDE ORA-01476 Eine Zahl durch Null teilen

Benutzerdefinierte Ausnahme

Neben den oben genannten vordefinierten Ausnahmen kann ein Programmierer benutzerdefinierte Ausnahmen erstellen und behandeln. Diese werden auf Unterprogrammebene im Deklarationsteil definiert und sind nur innerhalb dieses Unterprogramms sichtbar. Eine in einer 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 EXCEPTION-Typ definiert.
  • Sie kann dann auf die gleiche Weise wie eine vordefinierte Ausnahme verwendet werden.

Syntax: Auf Ebene der Paketspezifikation

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • In der obigen Syntax ist die Variable 'exception_name' als EXCEPTION-Typ in der Paketspezifikation definiert. Die
  • Es kann in der gesamten Datenbank überall dort verwendet werden, wo das Paket 'package_name' aufgerufen werden kann.

PL/SQL-Raise-Ausnahme

Alle vordefinierten Ausnahmen werden implizit ausgelöst, sobald der entsprechende Fehler auftritt. Benutzerdefinierte Ausnahmen müssen hingegen explizit mit dem Schlüsselwort RAISE ausgelöst werden. RAISE kann wie unten gezeigt verwendet werden.

Wird RAISE innerhalb eines Ausnahmebehandlers allein verwendet, wird die bereits ausgelöste Ausnahme an den übergeordneten Block weitergegeben. Es kann nur innerhalb eines Ausnahmeblocks verwendet werden, wie unten gezeigt.

Der folgende Screenshot zeigt die alleinige Verwendung von RAISE, um eine Ausnahme im umschließenden Block erneut auszulösen:

Eine Ausnahme mit einem einfachen RAISE an den übergeordneten Block weitergeben

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 innerhalb des Ausnahmebehandlungsblocks verwendet.
  • Wenn das Programm auf die Ausnahme 'exception_name' stößt, wird die Ausnahme behandelt und das Programm normal beendet.
  • Das Schlüsselwort RAISE im Handler leitet diese Ausnahme dann an das übergeordnete Programm weiter.

Hinweis: Wenn eine Ausnahme im übergeordneten Block ausgelöst wird, muss die ausgelöste Ausnahme auch im übergeordneten Block sichtbar sein; andernfalls Oracle wirft einen Fehler.

Sie können auch das Schlüsselwort RAISE gefolgt von einem Ausnahmenamen verwenden, um die entsprechende benutzerdefinierte oder vordefinierte Ausnahme auszulösen. Diese Form kann sowohl im Ausführungsteil als auch im Ausnahmebehandlungsteil verwendet werden.

Der folgende Screenshot zeigt RAISE gefolgt von einem Ausnahmenamen, um eine bestimmte Ausnahme auszulösen:

Eine bestimmte benannte Ausnahme wird mit RAISE gefolgt vom Ausnahmenamen ausgelöst.

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'.
  • Dies löst zur Laufzeit genau diese Ausnahme aus, die dann behandelt oder weiter ausgelöst werden muss.

Beispiel 1: In diesem Beispiel werden wir Folgendes sehen:

  • Wie man eine Ausnahme deklariert
  • Wie kann die deklarierte Ausnahme ausgelöst werden?
  • So verbreiten Sie es an den Hauptblock

Der folgende Screenshot zeigt den vollständigen Block, der sample_exception deklariert, sie innerhalb eines verschachtelten Blocks auslöst und sie an den Hauptblock weitergibt:

PL/SQL-Beispiel zum Deklarieren und Auslösen einer benutzerdefinierten Ausnahme in einem verschachtelten Block

Der folgende Screenshot zeigt dasselbe Beispiel in Fortsetzung, wobei der Hauptblock schließlich die weitergegebene Ausnahme abfängt:

Ausgabe, die die zuerst im verschachtelten Block und dann im Hauptblock erfasste Ausnahme anzeigt.

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 Erläuterung:

  • Code Zeile 2: Die Variable 'sample_exception' wird als EXCEPTION-Typ deklariert.
  • Code Zeile 3: Deklaration der Prozedur nested_block.
  • Code Zeile 6: Die Anweisung „Innerhalb eines verschachtelten Blocks“ wird ausgegeben.
  • Code Zeile 7: Die Anweisung „Ausnahme „sample_exception“ aus verschachteltem Block wird ausgegeben“ wird ausgegeben.
  • Code Zeile 8: Auslösen der Ausnahme mit „RAISE sample_Exception“.
  • Code Zeile 10: Ausnahmebehandlung für die Ausnahme sample_exception im verschachtelten Block.
  • Code Zeile 11: Die Meldung „Ausnahme im verschachtelten Block abgefangen. Weiterleitung an den Hauptblock“ wird ausgegeben.
  • Code Zeile 12: Die Ausnahme wird an den Hauptblock weitergeleitet (und somit weitergegeben).
  • Code Zeile 15: Die Aussage „Im Hauptblock“ wird ausgegeben.
  • Code Zeile 16: Drucken der Anweisung „Aufruf verschachtelter Blöcke“.
  • Code Zeile 17: Aufruf der Prozedur nested_block.
  • Code Zeile 19: Ausnahmehandler für sample_Exception im Hauptblock.
  • Code Zeile 20: Die Meldung „Ausnahme im Hauptblock erfasst“ wird ausgegeben.

Wichtige Punkte, die Sie in der Ausnahme beachten sollten

  • In einer Funktion sollte eine Ausnahme immer entweder einen Wert zurückgeben oder die Ausnahme weiter auslösen; andernfalls Oracle Wirft zur Laufzeit einen Fehler der Art „Funktion ohne Wert zurückgegeben“.
  • Transaktionskontrollanweisungen kann innerhalb des Ausnahmebehandlungsblocks ausgegeben werden.
  • SQLERRM und SQLCODE sind integrierte Funktionen, die die Fehlermeldung bzw. den Ausnahmecode zurückgeben.
  • Wird eine Ausnahme nicht behandelt, werden standardmäßig alle aktiven Transaktionen in dieser Sitzung zurückgesetzt.
  • RAISE_APPLICATION_ERROR (- , ) kann anstelle von RAISE verwendet werden, um einen Fehler mit einem benutzerdefinierten Code und einer benutzerdefinierten Meldung auszulösen. Der Fehlercode muss zwischen -20000 und -20999 liegen.

Häufig gestellte Fragen

PRAGMA EXCEPTION_INIT verknüpft einen benutzerdefinierten Ausnahmenamen mit einer bestimmten Oracle Fehlernummer. Nach der Bindung können Sie diesen ORA-Fehler anhand seines Namens in einer WHEN-Klausel abfangen, anstatt WHEN OTHERS zu verwenden und SQLCODE zu prüfen.

SQLCODE gibt den numerischen Fehlercode der aktuellen Ausnahme zurück, während SQLERRM deren Textmeldung liefert. Beide werden innerhalb einer Ausnahmebehandlungsroutine, meist im WHEN OTHERS-Block, aufgerufen, um den Fehler zu protokollieren oder anzuzeigen.

Vermeiden Sie WHEN OTHERS-Anweisungen, die jeden Fehler stillschweigend unterdrücken. Ohne die Protokollierung von SQLCODE und SQLERRM oder das erneute Auslösen mit RAISE werden Fehler verborgen. Verwenden Sie WHEN OTHERS nur, um die Ausnahme zu protokollieren, zu bereinigen und anschließend weiterzuleiten.

RAISE_APPLICATION_ERROR akzeptiert eine Fehlernummer zwischen -20000 und -20999 sowie eine Fehlermeldung mit bis zu 2048 Bytes. Die Ausführung wird gestoppt und eine benutzerdefinierte Fehlermeldung an die aufrufende Anwendung zurückgegeben, wodurch eine benutzerdefinierte Bedingung wie eine native Fehlermeldung erscheint. Oracle Fehler.

Nicht im selben Block – sobald die Ausführung in den EXCEPTION-Abschnitt wechselt, wird dieser Block beendet. Um fortzufahren, muss die risikobehaftete Anweisung in einen inneren BEGIN…EXCEPTION…END-Block eingeschlossen werden; nachdem der Fehler behandelt wurde, wird der äußere Block weiter ausgeführt.

Ein Fehler ist jedes Laufzeit- oder Kompilierproblem im Code. Eine Ausnahme ist der PL/SQL-Laufzeitmechanismus, der einen Laufzeitfehler darstellt und die Steuerung an den EXCEPTION-Abschnitt übergibt, damit das Programm reagieren kann, anstatt abrupt beendet zu werden.

Ja. KI-Assistenten und maschinelles Lernen zur Code-Überprüfung erstellen EXCEPTION-Blöcke, schlagen vordefinierte Ausnahmen vor, die abgefangen werden sollen, und kennzeichnen Codeabschnitte ohne entsprechende Behandlungsroutinen. Ein Entwickler sollte die Logik und die Fehlermeldungen dennoch vor der Bereitstellung überprüfen.

GitHub-Copilot Die Funktion vervollständigt WHEN-Klauseln, RAISE_APPLICATION_ERROR-Aufrufe und vollständige EXCEPTION-Blöcke anhand eines kurzen Kommentars, der die Absicht beschreibt. Dies beschleunigt die Programmierung von Routinebehandlungsroutinen, allerdings müssen die generierten Fehlercodes und -meldungen auf ihre Richtigkeit überprüft werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: