Les procédures stockées dans MySQL permettent d'organiser des opérations complexes directement au sein du serveur. Voici une présentation structurée des constructions de contrôle et des fonctions intégrées les plus couramment utilisées.
- Structures conditionnelles : IF-THEN-ELSE Permet de tester une condition et d'exécuter un bloc différent selon le résultat.
DELIMITER //
CREATE PROCEDURE traiter_valeur(IN valeur INT)
BEGIN
DECLARE resultat INT DEFAULT 0;
SET resultat = valeur - 1;
IF resultat = 0 THEN
INSERT INTO utilisateur(nom) VALUES ('cas_spécial');
ELSE
INSERT INTO utilisateur(nom) VALUES ('autre_cas');
END IF;
IF valeur = 0 THEN
UPDATE utilisateur SET age = 0 WHERE nom = 'cas_spécial';
ELSE
UPDATE utilisateur SET age = 1 WHERE nom = 'cas_spécial';
END IF;
END //
DELIMITER ;
- Sélection multiple : CASE Alternative à plusieurs IF imbriqués, idéal pour des choix multiples.
DELIMITER //
CREATE PROCEDURE selectionner_nom(IN type_val INT)
BEGIN
CASE type_val
WHEN 0 THEN INSERT INTO utilisateur(nom) VALUES ('zero');
WHEN 1 THEN INSERT INTO utilisateur(nom) VALUES ('un');
ELSE INSERT INTO utilisateur(nom) VALUES ('par_defaut');
END CASE;
END //
DELIMITER ;
Appel de la procédure :
CALL selectionner_nom(1);
- Boucle WHILE Exécute un bloc tant qu'une condition est vraie (test avant l’itération).
DELIMITER //
CREATE PROCEDURE compter_jusqu_a_dix(IN debut INT)
BEGIN
WHILE debut < 10 DO
INSERT INTO utilisateur(nom) VALUES ('boucle_while');
SET debut = debut + 1;
END WHILE;
END //
DELIMITER ;
- Boucle REPEAT Exécute le bloc au moins une fois, puis vérifie la condition après chaque itération (équivalent à do...while).
DELIMITER //
CREATE PROCEDURE compter_avec_repeat(IN init INT)
BEGIN
REPEAT
INSERT INTO utilisateur(nom) VALUES ('boucle_repeat');
SET init = init + 1;
UNTIL init > 10
END REPEAT;
END //
DELIMITER ;
La boucle se termine quand init > 10.
- Boucle LOOP avec LEAVE Boucle sans condition préalable, contrôlée via
LEAVEpour sortir.
DELIMITER //
CREATE PROCEDURE boucle_avec_sortie(IN depart INT)
BEGIN
boucle: LOOP
INSERT INTO utilisateur(nom) VALUES ('loop_custom');
SET depart = depart + 1;
IF depart > 10 THEN
LEAVE boucle;
END IF;
END LOOP;
END //
DELIMITER ;
- Étiquettes (Labels) et ITERATE Les étiquettes permettent de cibler des boucles.
ITERATEredémarre une boucle depuis son début.
DELIMITER //
CREATE PROCEDURE iteration_boucle(IN start_val INT)
BEGIN
DECLARE compteur INT DEFAULT 0;
boucle_etiquette: LOOP
IF compteur = 3 THEN
SET compteur = compteur + 1;
ITERATE boucle_etiquette;
END IF;
INSERT INTO utilisateur(nom) VALUES ('iteration_test');
SET compteur = compteur + 1;
IF compteur >= 5 THEN
LEAVE boucle_etiquette;
END IF;
END LOOP;
END //
DELIMITER ;
Fonctinos utiles en contexte de procédure
Manipulation de chaînes de caractères
CHARSET(str)– retourne l'ensemble de caractères utilisé.CONCAT(str1, str2, ...)– concatène plusieurs chaînes.INSTR(str, substr)– position de la première occurrence desubstr.LEFT(str, n)– extrait lesnpremiers caractères.SUBSTRING(str, pos, len)– extrait une sous-chaîne à partir depos(index 1-based).TRIM([BOTH | LEADING | TRAILING] [pad] FROM str)– supprime les espaces ou caractères spécifiés.REPLACE(str, old, new)– remplace toutes les occurrences deoldparnew.UPPER(str)/LOWER(str)– majuscules/minuscules.SPACE(count)– crée une chaîne decountespaces.
Opérations mathématiques
ABS(x)– valeur absolue.CEILING(x)– arrondi supérieur.FLOOR(x)– arrondi inférieur.ROUND(x, d)– arrondi àddécimales.RAND([seed])– nombre aléatoire entre 0 et 1.POWER(x, y)–x^y.MOD(a, b)– reste de la divisiona/b.HEX(n)– convertit un nombre entier en hexadécimal.CONV(num, from_base, to_base)– conversion entre bases.
Fonctions temporelles
NOW()– date et heure actuelles.CURDATE()– date actuelle.CURTIME()– heure actuelle.DATE_ADD(date, INTERVAL val unit)– ajoute une durée.DATE_SUB(date, INTERVAL val unit)– soustrait une durée.DATEDIFF(date1, date2)– différence en jours.YEAR(date),MONTH(date),HOUR(time)– extraction de parties de date/heure.STR_TO_DATE(str, format)– convertit une chaîne en date selon un format.TIME_TO_SEC(time)– converitt une heure en secondse.