====== D4-C05 : Procédures stockées et fonctions avec MariaDB ====== ===== Ressources ===== * Documentation officielle [[https://dev.mysql.com/doc/dev/mysql-server/latest/stored_programs.html|MySQL : Stored Programs]] * Bonnes pratiques SQL : conventions de nommage et gestion des droits * https://dotclear.placeoweb.com/post/R%C3%A8gles-et-conventions-de-nommage-SQL * https://fr.ittrip.xyz/sql/sql-naming-conventions| * Tutoriels professionnels (Zeste de savoir, Percona, MariaDB docs). ===== 1. Introduction ===== MariaDB (comme MySQL) permet d’écrire du code SQL réutilisable grâce aux **procédures stockées** et aux **fonctions stockées.** Ces programmes sont **stockés côté serveur** et **exécutés par le SGBD**. ===== Avantages en milieu professionnel ===== * Performance : moins d’échanges entre l’application et la base. * Sécurité : on limite l’accès aux tables brutes, les applications n’appellent que des procédures. * Maintenance : la logique métier est centralisée dans la base. * Réutilisabilité : une règle métier est codée une fois, utilisée partout. ===== 2. Procédures stockées ===== ==== Syntaxe générale ==== DELIMITER // CREATE PROCEDURE nom_procedure( [IN | OUT | INOUT] param_nom TYPE, ... ) BEGIN -- instructions SQL END // DELIMITER ; ==== Appel ==== CALL nom_procedure(valeurs_param); ==== Exemple simple ==== DELIMITER // CREATE PROCEDURE sp_nb_logements_vacants(OUT nb INT) BEGIN SELECT COUNT(*) INTO nb FROM logement WHERE etat = 'VACANT'; END // DELIMITER ; Appel et affichage du résultat : CALL sp_nb_logements_vacants(@result); SELECT @result AS "Nombre de logements vacants"; ===== 3. Fonctions stockées ===== ==== Syntaxe générale ==== DELIMITER // CREATE FUNCTION nom_fonction(param TYPE, ...) RETURNS TYPE DETERMINISTIC BEGIN DECLARE resultat TYPE; -- logique SET resultat = ...; RETURN resultat; END // DELIMITER ; ==== Appel : ==== SELECT nom_fonction(valeur); ==== Exemple simple ==== DELIMITER // CREATE FUNCTION fn_calcul_tva(prix_ht DECIMAL(10,2)) RETURNS DECIMAL(10,2) DETERMINISTIC BEGIN RETURN prix_ht * 1.20; END // DELIMITER ; ==== Utilisation : ==== SELECT fn_calcul_tva(100) AS prix_ttc; ===== 4. Gestion des erreurs ===== On peut intercepter une erreur grâce aux handlers : DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN -- log ou rollback SELECT 'Erreur rencontrée, annulation de la procédure' AS message; ROLLBACK; END; ===== 5. Curseurs ===== Quand une requête retourne plusieurs lignes, on peut les parcourir : DECLARE c CURSOR FOR SELECT nom, prenom FROM locataire; DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1; OPEN c; boucle: LOOP FETCH c INTO v_nom, v_prenom; IF fini = 1 THEN LEAVE boucle; END IF; -- traitement ligne par ligne END LOOP; CLOSE c; ===== 6. Bonnes pratiques professionnelles ===== - Nommage clair : sp_ pour procédures, fn_ pour fonctions. - Commenter chaque procédure (auteur, date, rôle, paramètres). - Centraliser la logique métier sensible dans des procédures. - Versionner les scripts SQL dans Git. - Donner des droits d’exécution sur les procédures plutôt que des droits directs sur les tables. [[d4:A06]]