CommencezCommencez gratuitement

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

Voir le cours

Instructions de l’exercice

  • Dans le premier bloc, insérez les enregistrements suivants dans patients (a1c=5.6, glucose=93, et fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) avec un gestionnaire EXCEPTION qui insère 'failed to insert' comme msg dans errors.
  • Ouvrez un deuxième bloc imbriqué et mettez à jour la personne patiente ayant l'ID 1 pour que fasting ait la valeur 'true', avec un traitement d'exception qui consigne dans la table errors un msg de 'Inserted string into boolean.'.
  • END les 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;
Modifier et exécuter le code