Blocuri multiple de excepții
Deoarece ROLLBACK TO și SAVEPOINT nu pot fi utilizate în funcții care conțin handlere de excepții, putem emula același comportament folosind blocuri imbricate. Aceste blocuri imbricate sunt folosite pentru a grupa și ordona instrucțiunile în funcție de dependențele dintre ele. În acest exercițiu, vei insera un bloc de înregistrări cu un handler de excepții care emulează un SAVEPOINT, apoi vei actualiza o înregistrare cu un alt handler de excepții. Instrucțiunea de actualizare va genera o eroare, iar handlerul de excepții va efectua automat rollback doar pentru acel bloc.
Acest exercițiu face parte din cursul
Tranzacții și gestionarea erorilor în PostgreSQL
Instrucțiuni pentru exercițiu
- În primul bloc, inserează în
patientsurmătoarele înregistrări (a1c=5.6,glucose=93,fasting=TRUE),(6.3, 111, TRUE),(4.7, 65, TRUE)și adaugă un handlerEXCEPTIONcare inserează'failed to insert'ca valoare a câmpuluimsgîn tabelaerrors. - Deschide un al doilea bloc imbricat și actualizează pacientul cu ID-ul 1 pentru a seta valoarea
fastingla'true', cu un handler de excepții care înregistrează în tabelaerrorsun mesajmsgcu valoarea'Inserted string into boolean.'. - Închide ambele blocuri cu
END.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
-- 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;