Multiples blocs d'exception
Comme ROLLBACK TO et SAVEPOINT ne peuvent pas être utilisés dans des fonctions avec des gestionnaires d'exceptions, on peut simuler le même comportement à l'aide de blocs imbriqués. Ces blocs servent à regrouper les instructions et à les exécuter dans l'ordre de leurs dépendances. Ici, vous allez insérer un lot d'enregistrements avec un gestionnaire d'exception qui émule un SAVEPOINT, puis mettre à jour un enregistrement avec un gestionnaire d'exception. Cette instruction de mise à jour provoquera une erreur, et le gestionnaire d'exception annulera automatiquement seulement ce bloc.
Cette activité fait partie du cours
Transactions et gestion des erreurs dans PostgreSQL
Instructions de l’exercice
- Dans le premier bloc, insérez les enregistrements suivants dans
patients(a1c=5.6,glucose=93, etfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)avec un gestionnaireEXCEPTIONqui insère'failed to insert'commemsgdanserrors. - Ouvrez un deuxième bloc imbriqué et mettez à jour la personne patiente ayant l'ID 1 pour que
fastingait la valeur'true', avec un traitement d'exception qui consigne dans la tableerrorsunmsgde'Inserted string into boolean.'. ENDles deux blocs.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
-- 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;