Více bloků výjimek
Protože ROLLBACK TO a SAVEPOINT nelze použít ve funkcích s obslužnými rutinami výjimek, existuje způsob, jak toto chování emulovat pomocí vnořených bloků. Tyto vnořené bloky slouží k seskupení a seřazení příkazů podle jejich vzájemných závislostí. V tomto cvičení vložíš skupinu záznamů s obslužnou rutinou výjimek, která emuluje SAVEPOINT, a poté aktualizuješ záznam s obslužnou rutinou výjimek. Příkaz pro aktualizaci skončí chybou a obslužná rutina výjimek automaticky provede rollback pouze tohoto bloku.
Toto cvičení je součástí kurzu
Transakce a ošetření chyb v PostgreSQL
Pokyny k cvičení
- V prvním bloku vlož do tabulky
patientsnásledující záznamy (a1c=5.6,glucose=93,fasting=TRUE),(6.3, 111, TRUE),(4.7, 65, TRUE)s obslužnou rutinouEXCEPTION, která do tabulkyerrorsvloží'failed to insert'jako hodnotu sloupcemsg. - Otevři druhý vnořený blok a aktualizuj pacienta s ID 1 tak, aby měl hodnotu
fastingnastavenou na'true', s obslužnou rutinou výjimek, která do tabulkyerrorszaznamenámsgs hodnotou'Inserted string into boolean.'. - Uzavři oba bloky pomocí
END.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
-- 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;