CommencerCommencer gratuitement

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

Afficher le cours

Instructions

  • 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 le patient avec l’ID 1 pour que fasting ait la valeur 'true', avec une gestion d’exception qui enregistre dans la table errors avec un msg égal à 'Inserted string into boolean.'.
  • END les 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;
Modifier et exécuter le code