Blocchi multipli di eccezione
Dato che ROLLBACK TO e SAVEPOINT non possono essere usati in funzioni con gestori di eccezioni, possiamo emulare lo stesso comportamento utilizzando blocchi annidati. Questi blocchi annidati servono a raggruppare e ordinare le istruzioni in base alle loro dipendenze. Qui inserirai un gruppo di record con un gestore di eccezione che emula un SAVEPOINT, poi aggiornerai un record con un gestore di eccezione. Quell’istruzione di UPDATE genererà un errore e il gestore di eccezione annullerà automaticamente solo quel blocco.
Questo esercizio fa parte del corso
Transazioni e gestione degli errori in PostgreSQL
Istruzioni dell'esercizio
- Nel primo blocco, inserisci i seguenti record in
patients(a1c=5.6,glucose=93, efasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)con un gestoreEXCEPTIONche inserisce'failed to insert'comemsgnella tabella errors. - Apri un secondo blocco annidato e aggiorna il paziente con ID 1 per avere
fastingpari a'true', con gestione delle eccezioni che registra nella tabellaerrorsunamsgpari a'Inserted string into boolean.'. ENDentrambi i blocchi.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
-- 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;