I. Récapitulatif des bases▲
D'abord un récapitulatif des bases pour ceux qui n'auraient pas lu mon article original. Les procédures stockées sont des bouts de code SQL stockés sur le serveur de bases de données qui peuvent être appelés par leurs noms depuis les clients. Les procédures stockées peuvent traitées de multiples commandes SQL, prendre des paramètres et retourner des DataSets. Les procédures stockées sont présentes dans d'autres systèmes de bases de données depuis plusieurs années jusqu'à ce que récemment cette fonctionnalité soit accessible dans MySQL. Le format d'une requête SQL pour créer une procédure stockée ressemble à ceci :
DELIMITER
$$
CREATE
PROCEDURE
`sdpExampleProcedure`
(
paramètre 1
VARCHAR
(
255
)
,
paramètre 2
INTEGER
)
BEGIN
/*
Requêtes SQL séparées par un point-virgule (;)
Utilisant paramètre 1 et paramètre 2 */
END
$$
DELIMITER
;
Notez la commande DELIMITER au début et à la fin qui change la manière de séparer les requêtes de MySQL. Ensuite pour appeler la procédure, vous pouvez utiliser la commande suivante :
CALL `sdpExampleProcedure`('testdata', '11');
II. Que puis-je faire avec les procédures stockées et pourquoi ?▲
Les procédures stockées peuvent être utilisées pour grouper les commandes SQL et ajouter une logique dans vos états SQL, tout en réduisant la quantité de données transférées depuis le serveur de bases de données et votre application. Par exemple, en administrant des sessions dans une application PHP. Si vous voulez mettre à jour un enregistrement session quand une requête est faite pour une session existante, ou créer une nouvelle session en tout vous pourriez faire tout cela avec des contrôles dans une procédure stockée. Cela devrait normalement consister à utiliser une commande SELECT pour récupérer toutes les données voulues depuis le serveur de données en rapport avec l'id de session donné, ensuite en programmant votre code pour exécuter une commande INSERT ou UPDATE qui dépend du nombre de lignes retournées. Avec les procédures stockées vous pouvez inclure tout ceci dans une seule commande SQL simple qui retourne simplement vrai quand une session est créée, et faux lorsque une session est mise à jour.
III. Déclarer et configurer des variables dans vos procédures stockées▲
En addition des paramètres définis qui sont passés durant l'appel, il est possible de définir des variables sur lesquelles travailler durant l'exécution. Pour faire ça vous devez utiliser la commande DECLARE, faisant état du nom et du type de la variable. Dans l'exemple suivant, je définis trois variables appelées « session_count », « session_id » et « session_content », de type INTEGER, VARCHAR (de taille 32) et TEXT respectivement.
DECLARE
session_count INTEGER
;
DECLARE
session_id VARCHAR
(
32
)
;
DECLARE
session_content TEXT
;
Maintenant que vous avez déclaré vos variables, vous pouvez configurer leur valeur en utilisant la commande SET. Une fois que ces variables ont une valeur, vous pouvez les utiliser plus tard dans votre procédure.
SET
session_count =
1
;
SET
session_id =
'699d571326815e40b8e1ae99af04563c'
;
SET
session_content =
'Du contenu de session ici'
;
Si vous connaissez la valeur de vos variables au moment de les déclarer, vous pouvez utiliser la commande DEFAULT pour les configurer. Ci-dessous j'ai condensé les six commandes en trois utilisant cette technique :
DECLARE
session_count INTEGER
DEFAULT
1
;
DECLARE
session_id VARCHAR
(
32
)
DEFAULT
'699d571326815e40b8e1ae99af04563c'
;
DECLARE
session_content TEXT
DEFAULT
''
Du contenu de session
ici;
IV. Donner des valeurs variables aux requêtes SELECT▲
Une utilisation excellente des variables dans vos procédures est d'utiliser le résultat d'une commande SELECT pour configurer la valeur d'une variable existante. Dans d'autres systèmes de bases de données, ceci est vraiment simple, cependant dans MySQL bien que ce soit simple, la syntaxe est quelque peu inattendue.
Dans le but de transmettre une valeur depuis une requête SELECT vers une variable, il y a une ligne supplémentaire que nous devons ajouter à la requête SELECT juste avant la définition de la table dans laquelle les données seront extraites. La commande INTO met les données dans une variable définie. Voici un exemple pour illustrer son utilisation :
DECLARE
session_count INTEGER
;
SELECT
COUNT
(*)
INTO
session_count
FROM
`tblSessions`
;
La variable session_count contient maintenant la valeur renvoyée par la requête SELECT qui compte le nombre de lignes dans la table des sessions. Il est aussi possible de mettre les valeurs dans de multiples variables comme dans l'exemple suivant :
DECLARE
user
VARCHAR
(
15
)
;
DECLARE
pass VARCHAR
(
32
)
;
SELECT
`strUserName`
, `strPassword`
INTO
user
, pass
FROM
`tblUsers`
LIMIT
0
, 1
;
V. Contrôler le flux de votre procédure stockée▲
Maintenant que nous avons configuré des variables et leur avons assigné des valeurs, nous pouvons contrôler le flux de notre procédure pour décider de ce que nous allons faire par la suite. MySQL supporte une flopée de contrôleurs de flux que vous allez utiliser comme vous pourrez le voir dans d'autres langages de programmation.
V-A. La commande IF▲
La commande IF est bien sûr le contrôle de flux le plus connu et est vraiment similaire dans MySQL comme partout ailleurs. La commande commence par IF, suivi d'une opération logique qui retourne vrai ou faux et se termine avec la première ligne qui finit par THEN. Les actions qui ont besoin de s'exécuter après la condition vraie peuvent ensuite être définies et une commande ELSE peut être définie au besoin. La commande IF se termine par une commande END IF ; (prenez note du point-virgule, source de beaucoup d'erreurs). La commande suivante vérifie si la variable « session_count » est supérieure à 0, si c'est le cas elle retourne vrai, sinon elle retourne faux.
IF
session_count >
0
THEN
SELECT
1
;
ELSE
SELECT
0
;
END
IF
;
V-B. La commande CASE▲
MySQL inclut une implémentation de la commande switch case comme la plupart des langages de programmation usuels. Il ne peut y avoir aucun lien entre les cas comme il peut y en avoir en PHP, mais il y a un cas par défaut au cas où aucune condition ne correspond. Voici un switch case qui essaie d'attraper une variable nommée « catchme » basée sur ses conditions. Le cas par défaut doit être appelé, car « catchme » ne correspond à aucune des conditions définies dans le switch case.
DECLARE
catchme INTEGER
DEFAULT
10
;
CASE
catchme
WHEN
2
THEN
SET
catchme =
catchme +
2
;
WHEN
5
THEN
SET
catchme =
catchme +
5
;
ELSE
SET
catchme =
50
;
END
CASE
V-C. La boucle WHILE▲
La boucle WHILE, outil commun hautement utilisé dans grand nombre de langages de programmation. MySQL n'y fait pas exception. La syntaxe est vraiment similaire aux autres la rendant facile à utiliser, mais voici un résumé. Les mots clefs principaux que vous devez vous rappeler pour utiliser une boucle while dans MySQL sont WHILE, DO et END WHILE;. Quand vous définissez une boucle while vous pouvez lui donner un label qui peut être utilisé par plusieurs commandes pour contrôler la boucle. Le label vient avant la définition de la boucle while et après la fin de la boucle. L'exemple simple suivant crée une boucle WHILE appelée « iterwhile » qui s'itère tant que la variable « iter » est inférieure à 9.
DECLARE
iter INTEGER
DEFAULT
0
;
iterwhile:
WHILE
iter <
9
DO
SET
iter =
iter +
1
;
END
WHILE
iterwhile;
V-D. La boucle LOOP▲
La commande LOOP ultra simple fait juste ça. Elle boucle indéfiniment jusqu'à ce que vous lui demandiez d'arrêter avec la commande LEAVE. Comme la boucle WHILE, elle peut être nommée grâce à un label dans sa définition afin d'être ciblée ensuite par des commandes pour la contrôler. Voici une commande LOOP appelée « iterloop » qui fait la même chose que l'exemple WHILE précédent, mais utilise une commande IF et une commande LEAVE pour s'arrêter.
DECLARE
iter INTEGER
DEFAULT
0
;
iterloop:
LOOP
IF
iter <
9
THEN
SET
iter =
iter +
1
;
ELSE
LEAVE
iterloop;
END
IF
;
END
LOOP
iterloop;
V-E. La boucle REPEAT▲
La commande REPEAT est essentiellement une boucle WHILE qui vérifie si les conditions correspondent à la fin de chaque itération contrairement au WHILE qui vérifie en début. Cela veut dire que quand vous utilisez la boucle REPEAT elle sera exécutée au moins une fois. Voici l'équivalent REPEAT de WHILE et LOOP vus précédemment :
DECLARE
iter INTEGER
DEFAULT
0
;
iterrepeat:
REPEAT
SET
iter =
iter +
1
;
UNTIL
iter <
9
END
REPEAT
iterrepeat;
V-F. Les commandes LEAVE et ITERATE▲
Les commandes LEAVE et ITERATE sont similaires aux commandes break et continue utilisées dans d'autres langages de programmation. Elles peuvent être appliquées à n'importe quelle boucle WHILE, LOOP ou REPEAT qui sont actuellement actives en y faisant référence au label donné à la boucle. L'exemple suivant utilise les commandes LEAVE et ITERATE dans une LOOP appelée « testloop » :
DECLARE
iter INTEGER
DEFAULT
0
;
testloop:
LOOP
IF
iter =
10
THEN
SET
iter =
iter +
12
;
ITERATE
testloop;
END
IF
;
IF
iter >
126
THEN
LEAVE
testloop;
END
IF
;
SET
iter =
iter +
1
;
END
LOOP
testloop;
VI. Conclusion▲
Un mix de ces commandes peut vraiment ajouter de la puissance à vos codes SQL. Pas seulement, car elles peuvent réduire le trafic réseau, mais parce que vous pouvez réduire le nombre d'appels à votre base de données significativement, rendant les choses un peu plus organisées. Si vous commencez seulement à utiliser ces techniques et avez des difficultés avec les erreurs de syntaxe SQL, veillez à bien vérifier vos commandes individuellement avant de les mettre ensemble dans une procédure. Gardez un œil sur le point-virgule aussi, il peut causer une belle somme de problèmes quand il n'est pas utilisé au bon endroit donc assurez-vous de pouvoir différencier une commande d'une autre.
VII. Liens▲
Vous pouvez aussi aller voir mes autres traductions.