PL/SQL - Ausnahmen: Ein Leitfaden für Anfänger

Hallo da draußen, zukünftige PL/SQL-Meister! Heute tauchen wir ein in die faszinierende Welt der Ausnahmen in PL/SQL. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind – ich werde Sie durch dieses Thema Schritt für Schritt führen, genau wie ich es über die Jahre mit unzähligen Schülern getan habe. Holen Sie sich eine Tasse Kaffee (oder Tee, wenn das Ihr Ding ist) und lassen Sie uns gemeinsam diese aufregende Reise antreten!

PL/SQL - Exceptions

Was sind Ausnahmen?

Bevor wir ins Detail gehen, lassen Sie uns verstehen, was Ausnahmen sind. Stellen Sie sich vor, Sie backen einen Kuchen (bleiben Sie mir erhalten, ich verspreche, das hat etwas mit Programmierung zu tun). Sie folgen dem Rezept Schritt für Schritt, aber plötzlich realizeiren Sie, dass Ihnen Eier ausgegangen sind! Diese unerwartete Situation ist ähnlich wie eine Ausnahme in der Programmierung.

In PL/SQL sind Ausnahmen unerwartete Ereignisse, die den normalen Ablauf Ihres Programms unterbrechen. Sie können Fehler wie das Versuch, durch Null zu teilen, oder das Einfügen eines doppelten Wertes in eine eindeutige Spalte sein. Anstatt diese Probleme unseren Programm abstürzen zu lassen, können wir sie elegant "verwalten" – genau wie Sie möglicherweise ein Ei-Ersatz in unserem Backbeispiel verwenden könnten.

Syntax für Ausnahmemeldungen

Nun schauen wir uns an, wie wir diese Ausnahmen in PL/SQL tatsächlich verwalten. Das grundlegende Muster sieht so aus:

BEGIN
-- Ihr normaler Code kommt hier hin
EXCEPTION
WHEN ausnahme_name1 THEN
-- Behandeln Sie Ausnahme 1
WHEN ausnahme_name2 THEN
-- Behandeln Sie Ausnahme 2
WHEN OTHERS THEN
-- Behandeln Sie alle anderen Ausnahmen
END;

Lassen Sie uns das auseinandernehmen:

  1. Wir schreiben unseren normalen Code im BEGIN-Block.
  2. Wenn eine Ausnahme auftritt, springt das Programm zum EXCEPTION-Block.
  3. Wir können spezifische Ausnahmen mit WHEN-Klauseln behandeln.
  4. Die WHEN OTHERS-Klausel fängt alle Ausnahmen auf, die wir nicht spezifisch behandelt haben.

Hier ist ein einfaches Beispiel:

DECLARE
v_ergebnis NUMBER;
BEGIN
v_ergebnis := 10 / 0;  -- Dies verursacht einen Divisionsfehler durch Null
DBMS_OUTPUT.PUT_LINE('Ergebnis: ' || v_ergebnis);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Fehler: Kann nicht durch Null teilen!');
END;

In diesem Beispiel versuchen wir, 10 durch 0 zu teilen, was mathematisch unmöglich ist. Anstatt abzustürzen, fängt unser Programm die ZERO_DIVIDE-Ausnahme und gibt eine freundliche Fehlermeldung aus.

Ausnahmen erzeugen

Manchmal möchten wir eigene Ausnahmen erzeugen, wenn bestimmte Bedingungen erfüllt sind. Wir können dies mit der RAISE-Anweisung tun. Es ist wie der Schiedsrichter in einem Fußballspiel – Sie sehen ein Foul, Sie blasen die Pfeife!

Hier ist, wie es funktioniert:

DECLARE
v_alter NUMBER := 15;
BEGIN
IF v_alter < 18 THEN
RAISE_APPLICATION_ERROR(-20001, 'Muß 18 oder älter sein');
END IF;
DBMS_OUTPUT.PUT_LINE('Willkommen im Club!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Fehler: ' || SQLERRM);
END;

In diesem Beispiel überprüfen wir, ob jemand alt genug ist, um in einen Club zu kommen. Wenn sie jünger als 18 Jahre sind, erzeugen wir eine Ausnahme mit einer benutzerdefinierten Fehlermeldung. Die WHEN OTHERS-Klausel fängt diese Ausnahme und gibt die Fehlermeldung aus.

Benutzerdefinierte Ausnahmen

Während PL/SQL viele voreingestellte Ausnahmen bietet, manchmal müssen wir unsere eigenen erstellen. Es ist wie das Erfinden einer neuen Regel in unserem Spiel. Hier ist, wie wir das tun können:

DECLARE
e_ungültiger_name EXCEPTION;
v_name VARCHAR2(50) := 'J0hn';
BEGIN
IF NOT REGEXP_LIKE(v_name, '^[A-Za-z]+$') THEN
RAISE e_ungültiger_name;
END IF;
DBMS_OUTPUT.PUT_LINE('Name ist gültig: ' || v_name);
EXCEPTION
WHEN e_ungültiger_name THEN
DBMS_OUTPUT.PUT_LINE('Fehler: Der Name sollte nur Buchstaben enthalten');
END;

In diesem Beispiel haben wir eine benutzerdefinierte Ausnahme e_ungültiger_name erstellt. Wir erzeugen diese Ausnahme, wenn der Name etwas anderes als Buchstaben enthält. Dies ermöglicht es uns, diese spezifische Situation auf eine Weise zu behandeln, die für unser Programm Sinn macht.

Voreingestellte Ausnahmen

PL/SQL bringt eine Reihe von voreingestellten Ausnahmen für häufige Fehler situations mit. Es ist wie ein Erste-Hilfe-Kasten für häufige Verletzungen bereit zu haben. Hier sind einige der am häufigsten verwendeten:

Ausnahme Name Beschreibung
NO_DATA_FOUND Ausgelöst, wenn eine SELECT INTO-Anweisung keine Zeilen zurückgibt
TOO_MANY_ROWS Ausgelöst, wenn eine SELECT INTO-Anweisung mehr als eine Zeile zurückgibt
ZERO_DIVIDE Ausgelöst, wenn versucht wird, durch Null zu teilen
DUP_VAL_ON_INDEX Ausgelöst, wenn versucht wird, einen doppelten Wert in eine eindeutige Indizes einzufügen
VALUE_ERROR Ausgelöst, wenn es zu einem arithmetischen, Konvertierungs-, Truncations- oder Größenbeschränkungsfehler kommt

Sehen wir uns ein Beispiel mit einer voreingestellten Ausnahme an:

DECLARE
v_mitarbeiter_name VARCHAR2(50);
BEGIN
SELECT first_name INTO v_mitarbeiter_name
FROM employees
WHERE employee_id = 1000;  -- Angenommen, diese ID existiert nicht

DBMS_OUTPUT.PUT_LINE('Mitarbeitername: ' || v_mitarbeiter_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Fehler: Kein Mitarbeiter mit dieser ID gefunden');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Fehler: Mehr als ein Mitarbeiter gefunden');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ein unerwarteter Fehler ist aufgetreten: ' || SQLERRM);
END;

In diesem Beispiel versuchen wir, den Namen eines Mitarbeiters abzurufen. Wenn kein Mitarbeiter gefunden wird, fangen wir die NO_DATA_FOUND-Ausnahme. Wenn aus irgendeinem Grund mehrere Mitarbeiter gefunden werden, fangen wir die TOO_MANY_ROWS-Ausnahme. Alle anderen unerwarteten Fehler werden von der WHEN OTHERS-Klausel abgefangen.

Und das ist es, Leute! Wir haben die Grundlagen der Ausnahmebehandlung in PL/SQL abgedeckt. Behalten Sie im Gedächtnis, dass das Behandeln von Ausnahmen wie das Anlegen eines Sicherheitsgurtes ist – es mag überflüssig erscheinen, wenn alles reibungslos läuft, aber es kann Ihnen viel Ärger ersparen, wenn etwas schief geht.

Üben Sie diese Konzepte, experimentieren Sie mit verschiedenen Szenarien und bald werden Sie Ausnahmen wie ein Profi behandeln. Viel Spaß beim Programmieren und möge Ihre Programme immer die Unerwarteten elegant handhaben!

Credits: Image by storyset