Les exceptions dans la base

La section EXCEPTION d'un bloc : exceptions prédéfinies, RAISE, OTHERS, propagation de bloc en bloc, et ce que l'erreur annule dans la transaction.

  • 25 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Exception prédéfinie : de quoi s'agit-il ?

    Voir la réponse

    Erreur que la base nomme elle-même, attrapée par son nom dans une clause WHEN : division_by_zero, unique_violation, no_data_found, too_many_rows.

    Chaque nom correspond à un code d'erreur SQLSTATE : unique_violation est le code 23505, que la base associe au message duplicate key value violates unique constraint.

  • Que montre ce bloc ?

    ```sql
    DO $$
    BEGIN
    BEGIN
    PERFORM 1 / 0;
    RAISE NOTICE 'A';
    END;
    RAISE NOTICE 'B';
    EXCEPTION
    WHEN division_by_zero THEN
    RAISE NOTICE 'C';
    END $$;
    `

    • Seulement C
    • A puis C
    • C puis B
    • B puis C
    Voir la réponse

    Seulement C

    La division échoue avant A : le bloc intérieur n'a pas de section EXCEPTION, l'erreur remonte au bloc extérieur. Sa clause WHEN affiche C, et le bloc extérieur s'arrête : B n'est jamais atteint.

  • Les traitements d'erreur se placent dans la section … du bloc, chacun introduit par … suivi du nom de l'exception.

    Voir la réponse

    Les traitements d'erreur se placent dans la section EXCEPTION du bloc, chacun introduit par WHEN suivi du nom de l'exception.

    Exemple : EXCEPTION WHEN division_by_zero THEN RAISE NOTICE 'diviseur nul';. La section est facultative et se place avant le END du bloc.

  • Exception levée par le programme : de quoi s'agit-il ?

    Voir la réponse

    Erreur que le code provoque lui-même avec RAISE EXCEPTION 'message', pour refuser une situation que la base ne juge pas fautive.

    Un solde insuffisant n'est pas une erreur pour la base : RAISE EXCEPTION 'Solde insuffisant : %', v_solde; l'en fait une. Sans ERRCODE précisé, on l'attrape par raise_exception.

  • Un virement entre deux comptes échoue de temps en temps sans que personne ne s'en aperçoive : aucune ligne écrite, aucun message. Le bloc se termine par EXCEPTION WHEN OTHERS THEN NULL;. Quelle correction apporter ?

    • Remplacer NULL par un COMMIT dans la clause, pour garder les écritures
    • Nommer les erreurs prévues, relever les autres
    • Ajouter un index sur la table des comptes pour accélérer le virement
    • Passer la transaction en SERIALIZABLE pour éviter les conflits
    Voir la réponse

    Nommer les erreurs prévues, relever les autres

    WHEN OTHERS THEN NULL avale toutes les erreurs et annule les écritures du bloc sans rien signaler. Il faut nommer ce qu'on sait traiter et laisser le reste remonter, avec RAISE; qui relève l'erreur attrapée.