Blocs d’exceptions multiples
Étant donné que ROLLBACK TO et SAVEPOINT ne peuvent pas être utilisés dans des fonctions avec des gestionnaires d’exceptions, nous pouvons imiter le même comportement grâce à des blocs imbriqués. Ces blocs servent à regrouper les instructions et à les ordonner selon 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 d’UPDATE va échouer, et le gestionnaire d’exception fera automatiquement un rollback de ce seul bloc.
Cet exercice fait partie du cours
Transactions et gestion des erreurs dans PostgreSQL
Instructions
- 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 le patient avec l’ID 1 pour que
fastingait la valeur'true', avec une gestion d’exception qui enregistre dans la tableerrorsavec unmsgégal à'Inserted string into boolean.'. ENDles deux blocs.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
-- 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;