PostgreSQL Fehlerbehandlung

PostgreSQLPostgreSQLBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie Fehlerbehandlungstechniken in PostgreSQL mit PL/pgSQL erkunden. Sie werden lernen, wie man Notices (Hinweise) ausgibt, Exceptions (Ausnahmen) abfängt, Fehler protokolliert und Ihre Fehlerbehandlungslogik testet. Dieses Lab ist für Anfänger konzipiert und führt Sie durch jeden Schritt.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL postgresql(("PostgreSQL")) -.-> postgresql/PostgreSQLGroup(["PostgreSQL"]) postgresql/PostgreSQLGroup -.-> postgresql/func_init("Define Simple Function") postgresql/PostgreSQLGroup -.-> postgresql/func_call("Call Stored Function") subgraph Lab Skills postgresql/func_init -.-> lab-550952{{"PostgreSQL Fehlerbehandlung"}} postgresql/func_call -.-> lab-550952{{"PostgreSQL Fehlerbehandlung"}} end

Notices in einer Funktion ausgeben (Raising Notices)

In diesem Schritt lernen Sie, wie Sie Notices (Hinweise) innerhalb einer PL/pgSQL-Funktion ausgeben. Notices sind informative Meldungen, die für das Debugging oder zur Bereitstellung von Feedback nützlich sein können. Sie sind weniger schwerwiegend als Fehler und verhindern nicht, dass die Funktion ausgeführt wird.

Verbinden Sie sich zunächst als Benutzer postgres mit der PostgreSQL-Datenbank:

sudo -u postgres psql

Erstellen wir nun eine Funktion namens greet, die einen Namen als Eingabe entgegennimmt und eine Notice mit einer Begrüßungsnachricht ausgibt. Führen Sie den folgenden SQL-Befehl in der psql-Shell aus:

CREATE OR REPLACE FUNCTION greet(name TEXT)
RETURNS TEXT AS $$
BEGIN
  RAISE NOTICE 'Hello, %!', name;
  RETURN 'Greeting sent!';
END;
$$ LANGUAGE plpgsql;

Diese Funktion akzeptiert ein name-Argument vom Typ TEXT. Die Zeile RAISE NOTICE 'Hello, %!', name; zeigt eine Notice-Meldung an. Das % ist ein Platzhalter, der durch den Wert der Variablen name ersetzt wird. Die Funktion gibt dann den String 'Greeting sent!' zurück.

Rufen wir die Funktion mit dem Namen 'LabEx' auf:

SELECT greet('LabEx');

Sie sollten eine ähnliche Ausgabe wie diese sehen:

NOTICE:  Hello, LabEx!
   greet
-----------
 Greeting sent!
(1 row)

Die NOTICE-Meldung "Hello, LabEx!" wird angezeigt und zeigt, dass die RAISE NOTICE-Anweisung ausgeführt wurde.

Sie können auch verschiedene Ebenen von Notices verwenden, z. B. RAISE WARNING und RAISE INFO. RAISE WARNING weist auf ein potenzielles Problem hin, während RAISE INFO weniger wichtige Informationen liefert.

Ändern wir die Funktion, um eine Warnung auszugeben, wenn der Name leer ist:

CREATE OR REPLACE FUNCTION greet(name TEXT)
RETURNS TEXT AS $$
BEGIN
  IF name = '' THEN
    RAISE WARNING 'Name is empty!';
  ELSE
    RAISE NOTICE 'Hello, %!', name;
  END IF;
  RETURN 'Greeting sent!';
END;
$$ LANGUAGE plpgsql;

Wenn Sie die Funktion nun mit einem leeren String aufrufen:

SELECT greet('');

Wird eine Warnmeldung angezeigt:

WARNING:  Name is empty!
   greet
-----------
 Greeting sent!
(1 row)

Dies demonstriert, wie Sie RAISE NOTICE und RAISE WARNING verwenden können, um Feedback innerhalb einer PL/pgSQL-Funktion zu geben.

Exceptions in PL/pgSQL abfangen (Catching Exceptions)

In diesem Schritt lernen Sie, wie Sie Exceptions (Ausnahmen) in PL/pgSQL mit dem EXCEPTION-Block abfangen. Die Ausnahmebehandlung ermöglicht es Ihnen, Fehler auf elegante Weise zu behandeln, zu verhindern, dass Ihre Funktion abstürzt, und informative Fehlermeldungen bereitzustellen.

Die grundlegende Struktur eines Exception-Blocks ist:

BEGIN
  -- Code, der eine Exception auslösen könnte
EXCEPTION
  WHEN exception_name THEN
    -- Code zur Behandlung der Exception
END;

Die Schlüsselwörter BEGIN und END definieren den Codeblock, in dem Exceptions auftreten können. Das Schlüsselwort EXCEPTION leitet den Abschnitt zur Ausnahmebehandlung ein. Die WHEN-Klausel gibt den Typ der abzufangenden Exception an, und der Code nach THEN wird ausgeführt, wenn diese Exception auftritt.

Erstellen wir eine Funktion, die versucht, eine Zahl durch Null zu teilen, und die resultierende Exception abfängt. Wir nennen sie safe_divide.

CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
  RETURN numerator / denominator;
EXCEPTION
  WHEN division_by_zero THEN
    RAISE NOTICE 'Division by zero occurred!';
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Diese Funktion akzeptiert zwei Integer-Argumente, numerator (Zähler) und denominator (Nenner). Innerhalb des BEGIN-Blocks wird versucht, den numerator durch den denominator zu teilen. Wenn der denominator Null ist, wird eine division_by_zero-Exception (Division durch Null) ausgelöst. Der EXCEPTION-Block fängt diese Exception ab, gibt eine Notice aus und gibt NULL zurück.

Rufen wir nun die Funktion mit einem Divisor von Null auf:

SELECT safe_divide(10, 0);

Sie sollten eine ähnliche Ausgabe wie diese sehen:

NOTICE:  Division by zero occurred!
 safe_divide
-------------
          NULL
(1 row)

Die NOTICE-Meldung "Division by zero occurred!" wird angezeigt, und die Funktion gibt NULL zurück, was anzeigt, dass die Exception abgefangen und behandelt wurde.

Rufen wir nun die Funktion mit gültigen Eingaben auf:

SELECT safe_divide(10, 2);

Sie sollten eine ähnliche Ausgabe wie diese sehen:

 safe_divide
-------------
           5
(1 row)

Die Funktion gibt den korrekten Quotienten 5 zurück, ohne Exceptions auszulösen.

Sie können auch andere Arten von Exceptions abfangen, z. B. numeric_value_out_of_range (numerischer Wert außerhalb des zulässigen Bereichs), null_value_not_allowed (Nullwert nicht erlaubt) und others (andere). Der others-Exception-Handler fängt jede Exception ab, die nicht explizit durch eine vorherige WHEN-Klausel behandelt wird.

Ändern wir die Funktion, um jede Exception abzufangen und -1 zurückzugeben:

CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
  RETURN numerator / denominator;
EXCEPTION
  WHEN division_by_zero THEN
    RAISE NOTICE 'Division by zero occurred!';
    RETURN NULL;
  WHEN OTHERS THEN
    RAISE NOTICE 'An unexpected error occurred: %', SQLERRM;
    RETURN -1;
END;
$$ LANGUAGE plpgsql;

In dieser geänderten Funktion wird der OTHERS-Exception-Handler ausgeführt, wenn eine andere Exception als division_by_zero auftritt. SQLERRM ist eine integrierte Variable, die die Fehlermeldung enthält, die der Exception zugeordnet ist.

Zusammenfassung

In diesem Lab haben Sie Techniken zur Fehlerbehandlung in PostgreSQL mit PL/pgSQL untersucht. Sie haben gelernt, wie Sie Notices (Hinweise) innerhalb von Funktionen mit RAISE NOTICE, RAISE WARNING und RAISE INFO ausgeben, um informative Meldungen bereitzustellen. Sie haben auch gelernt, wie Sie Exceptions (Ausnahmen) mit BEGIN...EXCEPTION...END-Blöcken abfangen und Fehlerdetails zur Überwachung und zum Debugging in einer Tabelle protokollieren. Abschließend haben Sie das Testen Ihrer Fehlerbehandlungslogik geübt, um Robustheit sicherzustellen.