IniziaInizia gratis

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

Visualizza il corso

Istruzioni dell'esercizio

  • Nel primo blocco, inserisci i seguenti record in patients (a1c=5.6, glucose=93, e fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) con un gestore EXCEPTION che inserisce 'failed to insert' come msg nella tabella errors.
  • Apri un secondo blocco annidato e aggiorna il paziente con ID 1 per avere fasting pari a 'true', con gestione delle eccezioni che registra nella tabella errors una msg pari a 'Inserted string into boolean.'.
  • END entrambi 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;
Modifica ed esegui il codice