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.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- 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_violationest le code 23505, que la base associe au messageduplicate 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 ApuisCCpuisBBpuisC
Voir la réponse
Seulement
CLa division échoue avant
A: le bloc intérieur n'a pas de section EXCEPTION, l'erreur remonte au bloc extérieur. Sa clause WHEN afficheC, et le bloc extérieur s'arrête :Bn'est jamais atteint.- Seulement
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 parraise_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 NULLavale 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, avecRAISE;qui relève l'erreur attrapée.