Wiele bloków obsługi wyjątków
Ponieważ ROLLBACK TO i SAVEPOINT nie mogą być używane w funkcjach z obsługą wyjątków, istnieje sposób na emulowanie tego samego zachowania za pomocą zagnieżdżonych bloków. Bloki te służą do grupowania i porządkowania instrukcji zgodnie z kolejnością ich wzajemnych zależności. W tym ćwiczeniu wstawisz blok rekordów z obsługą wyjątków emulującą działanie SAVEPOINT, a następnie zaktualizujesz rekord z obsługą wyjątków. Instrukcja aktualizacji spowoduje błąd, a obsługa wyjątków automatycznie wycofa tylko ten blok.
To ćwiczenie jest częścią kursu
Transakcje i obsługa błędów w PostgreSQL
Instrukcje do ćwiczenia
- W pierwszym bloku wstaw do tabeli
patientsnastępujące rekordy (a1c=5.6,glucose=93,fasting=TRUE),(6.3, 111, TRUE),(4.7, 65, TRUE)z obsługąEXCEPTION, która wstawia'failed to insert'jakomsgdo tabeli errors. - Otwórz drugi zagnieżdżony blok i zaktualizuj pacjenta o ID równym 1, ustawiając wartość
fastingna'true', z obsługą wyjątków zapisującą wpis do tabelierrorsz komunikatemmsgrównym'Inserted string into boolean.'. - Zamknij oba bloki instrukcją
END.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
-- 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;