Création d'une procédure
La syntaxe est relativement simple et se présente sous la forme suivante :
Code : SQL1 | CREATE PROCEDURE nom_de_la_procedure([parametres])
|
Le nommage respecte les règles habituelles, imaginons donc une procédure nommée '
sdz', elle sera créée sous la forme :
Code : SQL1 | CREATE PROCEDURE sdz() caracteristiques
|
Rien de compliqué jusque là, mais le point le plus important concerne les paramètres qui se décomposent en trois parties.
sens_du_parametre nom_parametre type_parametre
Le
sens du parametre peut prendre 3 valeurs :
IN : le paramètre sera une valeur ou une variable d'entrée. Le paramètre indiqué peut être une valeur ou une variable que vous envoyez lors de l'appel, et qui sera utilisé à l'intérieur de la procédure.
OUT : le paramètre sera une variable de sortie. Le paramètre indiqué sera une variable (
de session ou
de procédure) qui prendra une valeur (enfin normalement, sinon ça n'a que peu d'intérêt) lors de la procédure.
INOUT : le paramètre sera une variable d'entrée-sortie. Cette variable pourra être utilisé ou non dans la procédure, et verra normalement sa valeur modifiée lors de la procédure.
Le
nom_parametre suit les règles de nommage habituel. Ce nom de paramètre représentera par la suite dans la procédure une variable qui aura pour valeur celle qu'on lui aura assigné.
Si vous ne comprenez pas ce que ça veut dire, ce n'est pas grave, les exemples ci-dessous sont là pour ça.
Le
type_parametre prend en valeur le type de la valeur ou de variable attendu.
Avant de passer à la pratique, rappelons un point important : les procédures stockées sont, comme leur nom l'indique, stockées... J'entends déjà des
"on s'en serait douté". En fait, s'il est vrai qu'elles le sont, ceci entraîne plusieurs choses importantes et qui font toute la puissance des procédures stockées. De par ce statut, elles sont à tout moment utilisables ; ainsi, les déclarer une fois pour une base de données suffit pour pouvoir les utiliser par la suite à tout moment. Contrairement aux requêtes préparées, elles ne dépendent pas d'un thread et ne sont pas détruites automatiquement ; de même, elles restent présentes si le serveur s'arrête.
Ceux disposant de
MySQL Query Browser pourront par la suite vérifier cet état de fait en ouvrant la base qu'ils ont utilisée, et verront apparaître en dessous des tables, de nouvelles icônes qui, sur leur côté, porte le nom de la procédure concernée.
Passons maintenant aux exemples.
Pour commencer, nous allons changer le délimiteur de fin de requête utilisé, ceci non pas afin de vous perturber mais tous simplement par commodité pour la suite. Pour ce faire, tapez ceci en ligne de commande :
Code : SQL
Désormais, quand vous terminerez une requête, il ne faudra plus faire
; mais
|.
Première procédure
Nous allons créer une procédure qui nous renvoie la valeur que nous lui avons passée en paramètre.
Code : SQL1
2
3
4 | CREATE PROCEDURE sdz(IN valeur VARCHAR(20))
BEGIN
SELECT valeur;
END|
|
Ceci est la structure complète d'une procédure : comme vous le voyez, ici apparaissent des choses dont je n'ai pas encore parlé :
BEGIN et
END, qui permettent de mettre plusieurs instructions à l?intérieur. Et chaque instruction à l?intérieur de ce bloc se termine bien par
;, qui n'est en rien une erreur car si nous avions laissé notre délimiteur normal, alors ça n'aurait pas marché. Pour ceux qui ne me croient pas, je les invite à remettre le délimiteur
; normal en faisant :
Code : SQL
et à réessayer.

Dans ce bloc, nous voyons une instruction qui va chercher la valeur que nous avons passée en paramètre d'entrée, et qui a été stockée dans la variable '
valeur'.
Voilà : vous avez fait votre première procédure, ô combien simpliste.
Appel d'une procédure
Nous avons vu dans la partie précédente comment créer une procédure, nous allons apprendre désormais à l'appeler.
Pour cela rien de plus simple, tapez :
Code : SQL
Si avez toujours le délimiteur
|, vous ne devriez pas avoir de problème et en suivant les étapes depuis le début, vous aurez le résultat suivant :
Remarquez qu'ici l'appel est relativement simple, on peux complexifier la chose en partant du principe que notre valeur est dans une variable : pour ce faire, on va déclarer une nouvelle variable '
@a', à laquelle on affectera une valeur :
Code : SQL
Notre
variable de session vaut donc désormais
666.
Bien ! Appelons notre procédure avec cette variable :
Code : SQL
et la valeur qui va s'afficher est notre
666.
Tu ne nous avais pas dit qu'il existait autre chose que IN ?
Absolument, et maintenant que vous avez vu le principe de base, nous allons refaire une procédure mais qui elle prendra en plus un paramètre de sortie. Pour l'occasion, on va faire un truc plus utile que précédemment.

Calculons le carré d'un nombre :
Code : SQL1
2
3
4 | CREATE PROCEDURE carre(IN valeur INT, OUT toto BIGINT)
BEGIN
SELECT valeur*valeur INTO toto;
END|
|
En plus, on a un deuxième paramètre qui recevra une variable qui servira pour la sortie, de type
BIGINT.
Dans le bloc d'instructions, on a une requête qui prend la valeur d'entrée, la multiplie par elle-même et le
INTO va permettre de dire
"stocke-moi le résultat ici", qui sera alors mis dans la variable locale '
toto'. Cette variable n'est pas accessible en dehors.
Ouais : donc le résultat, on le récupère comment ?
Ah vous allez voir, c'est simple.

On appelle la procédure que l'on vient de créer comme ceci :
Code : SQL
Là, on demande de calculer le
carré de 2 en passant
2 à la valeur d'entrée, et on indique la variable '
@b' qui stockera le résultat pour la sortie : remarquez que cette variable est, dans ce cas-ci, globale à la session (ce qui veut dire qu'une autre session peut très bien appeler la même procédure sans que les résultats ne s'écrasent : donc, chaque résultat est lié à la session).
J'ai fait comme toi mais il ne se passe rien...
En fait c'est normal, la vraie magie c'est maintenant :
Code : SQL
La requête retourne le résultat du calcul, c'est-à-dire :
4.
Si vous avez tout compris jusque là, alors rendez-vous à la suite.
Supprimer une procédure
Certainement la partie la plus courte du tutoriel. vous venez de créer deux procédures dans les parties précédentes, bien : nous allons supprimer la première qui ne sert strictement à rien.
Code : SQL
vous venez de supprimer votre procédure. Eh oui, c'est déjà fini...
| vaut ; si vous avez lancé une autre fenêtre ou relancé la fenêtre des parties précédentes.
Voir les procédures existantes
Vous souhaiterez certainement savoir par la suite comment lister les procédures que vous avez créées : pour cela, rien de plus simple. Si vous voulez voir TOUTES les procédures de toutes les BDDs auxquelles vous avez un accès, alors :
Code : SQL1 | SHOW PROCEDURE STATUS LIKE '%%'\G
|
Remarquez dans ce cas que j'ai utilisé
'%%' pour indiquer que je veux toutes les procédures (rien ne vous empêche de mettre une expression qui corresponde plus à vos besoins) et
\G comme délimiteur de fin de requête pour avoir un affichage lisible humainement en ligne de commande.
Vous remarquerez certainement le paramètre
Security_type dont je n'ai pas encore parlé : sachez qu'il peut être intéressant pour vous de le connaître tout comme la ligne :
Definer, mais j'y reviendrai plus tard.
Avant de passer à la suite, je tiens à signaler que le
LIKE '%%' n'est pas obligatoire
dans ce cas, vous aurez le même affichage sans.
Affichage de la structure des procédures
Il est possible que vous ayez envie de voir à quoi ressemble votre procédure une fois que vous l'aurez créée : pour cela, faites :
Code : SQL1 | SHOW CREATE PROCEDURE nom_procedure \G
|
Vous devez connaître le nom de la procédure, et celle-ci doit se trouver dans la base de données courante : si vous essayer d'appeler une procédure (que vous auriez vue par exemple grâce à la requête donnée en début de cette partie) qui se trouve dans une autre base, vous aurez une erreur vous signalant que la procédure n'existe pas.
Ceci paraît relativement logique dans la mesure où chaque base de données peut avoir des procédures qui, dans ce cas, auront des noms communs.
Comme vous le remarquez, le code de la procédure apparaît avec d'autres renseignements.
