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
Anleitung zur Übung
- Füge im ersten Block die folgenden Datensätze in
patientsein (a1c=5.6,glucose=93undfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)mit einemEXCEPTION-Handler, der'failed to insert'alsmsginerrorseinträgt. - Öffne einen zweiten verschachtelten Block und aktualisiere den Patienten mit der ID 1 so, dass
fastingden Wert'true'erhält, mit Exception-Handling, das in der Tabelleerrorseinen Eintrag mit dermsg'Inserted string into boolean.'speichert. - Schließe beide Blöcke mit
ENDab.
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;