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;
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);
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;
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
- @var : variables de session ; INTO pour capturer un résultat.
- Procédure = suite d'instructions nommée (IN/OUT/INOUT), appelée par CALL.
- Fonction stockée = renvoie une valeur, utilisable dans un SELECT.
- IF/CASE/boucles structurent la logique — à réserver aux traitements données.