LoslegenKostenlos loslegen

Mehrere Exception-Blöcke

Da ROLLBACK TO und SAVEPOINT in Funktionen mit Exception-Handlern nicht verwendet werden können, gibt es eine Möglichkeit, dasselbe Verhalten mit verschachtelten Blöcken zu emulieren. Diese verschachtelten Blöcke dienen dazu, Anweisungen nach ihren Abhängigkeiten zu gruppieren und zu ordnen. Hier fügst du zunächst einen Block von Datensätzen mit einem Exception-Handler ein, der ein SAVEPOINT emuliert, und aktualisierst anschließend einen Datensatz mit einem Exception-Handler. Diese UPDATE-Anweisung führt zu einem Fehler, und der Exception-Handler macht automatisch nur diesen Block rückgängig.

Diese Übung ist Teil des Kurses

Transaktionen und Fehlerbehandlung in PostgreSQL

Kurs anzeigen

Anleitung zur Übung

  • Füge im ersten Block die folgenden Datensätze in patients ein (a1c=5.6, glucose=93 und fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) mit einem EXCEPTION-Handler, der 'failed to insert' als msg in errors einträgt.
  • Öffne einen zweiten verschachtelten Block und aktualisiere den Patienten mit der ID 1 so, dass fasting den Wert 'true' erhält, mit Exception-Handling, das in der Tabelle errors einen Eintrag mit der msg 'Inserted string into boolean.' speichert.
  • Schließe beide Blöcke mit END ab.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

-- Make a DO function
DO $$
-- Open a transaction block
BEGIN
    -- Open a nested block
    BEGIN
    	INSERT INTO ___ (___, ___, ___) 
        VALUES (5.6, 93, TRUE), ___, ___;
    -- Catch all exception types
    EXCEPTION WHEN others THEN
    	INSERT INTO ___ (msg) VALUES ('failed to insert');
    -- End nested block
    END;
    -- Begin the second nested block
	BEGIN
    	UPDATE patients SET ___ = '___' WHERE id=1;
    -- Catch all exception types
    EXCEPTION WHEN others THEN
        INSERT INTO errors (msg) VALUES ('Inserted ___ into ___.');
    -- End the second nested block
    END;
-- END the outer block
END;
$$ language 'plpgsql';
SELECT * FROM errors;
Code bearbeiten und ausführen