🛢️Parcours Fioul GroupéMySQL · Chapitre 09
Accueil › MySQL › Chapitre 09
Chapitre 09 / 16

Variables, procédures et fonctions stockées

MySQL n'est pas qu'un exécuteur de requêtes : on peut y programmer de la logique — variables, procédures, fonctions, structures de contrôle — exécutée au plus près des données.

1 Notion

Variables de session

SET @seuil = 5000;
SELECT libelle FROM v_campagne_volume WHERE volume_total > @seuil;

-- récupérer une valeur dans une variable
SELECT AVG(prix_litre) INTO @moyenne FROM campagne;
SELECT @moyenne;
2 Notion

Procédures stockées

Une procédure regroupe des instructions sous un nom, avec des paramètres IN, OUT ou INOUT. On change le délimiteur pour écrire les ; internes.

DELIMITER $$
CREATE PROCEDURE cloturer_campagne(IN p_id INT)
BEGIN
  UPDATE campagne SET statut = 'CLOTUREE' WHERE id = p_id;
  UPDATE commande SET statut = 'VALIDEE'
  WHERE campagne_id = p_id AND statut = 'CONFIRMEE';
END $$
DELIMITER ;

CALL cloturer_campagne(1);
3 Notion

Fonctions stockées

Une fonction renvoie une valeur et s'utilise dans une requête, comme une fonction intégrée.

DELIMITER $$
CREATE FUNCTION cout_commande(p_litres INT, p_prix DECIMAL(6,3))
RETURNS DECIMAL(10,2) DETERMINISTIC
BEGIN
  RETURN ROUND(p_litres * p_prix, 2);
END $$
DELIMITER ;

SELECT c.id, cout_commande(c.litres, ca.prix_litre) AS cout
FROM commande c JOIN campagne ca ON c.campagne_id = ca.id;
4 Notion

Structures de contrôle

-- dans un bloc BEGIN ... END
IF v_volume >= 5000 THEN
  SET v_prix = v_prix - 0.05;
ELSEIF v_volume >= 2000 THEN
  SET v_prix = v_prix - 0.02;
END IF;
Avec discernement — la logique stockée rapproche le traitement des données mais se versionne et se teste mal. Gardez la logique métier dans l'application (l'API Spring) quand c'est possible.
🛢️ Sur le projet Fioul Groupé

cloturer_campagne encapsule le geste métier « clôture » : passer la campagne en CLOTUREE et valider toutes ses commandes confirmées, en une seule opération cohérente. cout_commande calcule le montant dû par chaque foyer.

À retenir
← Chapitre 08