Chapitre 73 minAvancé
Méthodologie d'examen
Par Josselyn C., prof de BTS SIO. Mis à jour le .
7.1 Comment les procedures et triggers tombent a l'examen
Les sujets de BTS SIO SLAM presentent generalement :
- Un schema relationnel (MCD/MLD ou directement les tables SQL).
- Un cahier des charges ou des regles de gestion.
- Des questions du type : "Ecrire une procedure stockee qui..." ou "Ecrire un trigger qui...".
Les formes les plus frequentes :
- Ecrire une procedure stockee a partir d'un besoin metier decrit en francais.
- Ecrire un trigger a partir d'une regle de gestion ("A chaque vente, le stock doit diminuer automatiquement").
- Completer une procedure ou un trigger dont une partie du code est fournie.
- Identifier les erreurs dans un code donne.
- Expliquer le comportement d'un trigger ou d'une procedure donne.
7.2 Les erreurs classiques
| Erreur | Consequence | Solution |
|---|---|---|
Oublier DELIMITER // et DELIMITER ; | Erreur de syntaxe, la procedure n'est pas creee | Toujours ecrire DELIMITER avant et apres |
| Confondre IN et OUT | Le parametre ne retourne pas la valeur attendue | IN = entree, OUT = sortie, toujours se poser la question : "qui fournit la valeur ?" |
| Confondre NEW et OLD | Le trigger lit les mauvaises valeurs | NEW = nouvelles valeurs, OLD = anciennes. Tableau de reference au 5.3 |
| Utiliser NEW dans un trigger DELETE | Erreur a l'execution | NEW n'existe pas en DELETE, utiliser OLD |
| Utiliser OLD dans un trigger INSERT | Erreur a l'execution | OLD n'existe pas en INSERT, utiliser NEW |
Oublier FOR EACH ROW | Erreur de syntaxe | Toujours l'ecrire, c'est obligatoire en MySQL |
Oublier RETURNS dans CREATE FUNCTION | Erreur de syntaxe | Une fonction doit toujours declarer son type de retour |
Oublier RETURN dans le corps d'une fonction | Erreur a l'execution | Le corps doit contenir au moins un RETURN |
| Nommer un parametre comme une colonne | La clause WHERE ne filtre plus correctement | Prefixer les parametres par p_ |
| Placer DECLARE apres une instruction | Erreur de syntaxe | Tous les DECLARE doivent etre au debut du bloc BEGIN |
Oublier END IF, END LOOP, END WHILE | Erreur de syntaxe | Chaque structure de controle a son END |
7.3 Checklist avant de rendre sa copie
- Le
DELIMITER //est present avant la creation,DELIMITER ;apres. - Chaque parametre a le bon mode : IN, OUT ou INOUT.
- Les noms de parametres ne sont pas identiques aux noms de colonnes.
- Les
DECLAREsont au debut du bloc BEGIN (variables, puis curseurs, puis handlers). - Chaque IF a son
END IF, chaque LOOP a sonEND LOOP, etc. - Les triggers utilisent NEW et OLD correctement selon l'evenement.
FOR EACH ROWest present dans le CREATE TRIGGER.- Le SIGNAL SQLSTATE utilise le code
'45000'(avec les apostrophes). - Les transactions ont un COMMIT et un ROLLBACK.
- La procedure est testable : on peut ecrire un CALL avec des valeurs concretes.