ÎncepețiÎncepe gratuit

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

Vezi cursul

Instrucțiuni pentru exercițiu

  • În primul bloc, inserează în patients următoarele înregistrări (a1c=5.6, glucose=93, fasting=TRUE), (6.3, 111, TRUE), (4.7, 65, TRUE) și adaugă un handler EXCEPTION care inserează 'failed to insert' ca valoare a câmpului msg în tabela errors.
  • Deschide un al doilea bloc imbricat și actualizează pacientul cu ID-ul 1 pentru a seta valoarea fasting la 'true', cu un handler de excepții care înregistrează în tabela errors un mesaj msg cu 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;
Editează și rulează codul