sio2:d4-a06-les_procedures_et_fonctions_stockees

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
sio2:d4-a06-les_procedures_et_fonctions_stockees [2024/11/21 15:12] – [Les curseurs] dthevenotsio2:d4-a06-les_procedures_et_fonctions_stockees [2025/03/24 08:44] (Version actuelle) – [Exemples à tester] dthevenot
Ligne 1: Ligne 1:
 ~~SLIDESHOW~~ ~~SLIDESHOW~~
-====== Les fonctions et les procédures stockées avec Mysql ======+====== D4-A05 : Les fonctions et les procédures stockées avec Mysql ======
  
 Tout comme Oracle possède son langage PL/SQL et MS SQL Server son Transact-SQL, MySQL possède aussi un langage de programmation, et donc MariaDB également. La syntaxe reste propre au SGBD. Tout comme Oracle possède son langage PL/SQL et MS SQL Server son Transact-SQL, MySQL possède aussi un langage de programmation, et donc MariaDB également. La syntaxe reste propre au SGBD.
 +=====  =====
  
 Une procédure stockée, aussi appelée **stored procedure** en anglais, est un concept utilisé en administration de base de données afin d’exécuter un ensemble d’instructions SQL. Une telle procédure est stockée au sein du Système de Gestion de Base de Donneés (SGBD) et peut être appelée à tout moment par son nom afin d’exécuter celle-ci. Une procédure stockée, aussi appelée **stored procedure** en anglais, est un concept utilisé en administration de base de données afin d’exécuter un ensemble d’instructions SQL. Une telle procédure est stockée au sein du Système de Gestion de Base de Donneés (SGBD) et peut être appelée à tout moment par son nom afin d’exécuter celle-ci.
 +=====  =====
  
 Les procédures stockées permettent aussi l'utilisation de bibliothèques et de fonctions sur le serveur. Les langages de programmation modernes ont déjà intégré ce type de concept, et l'utilisation de ces langages de programmation externes reste valable et utile en dehors de la base de données. Les procédures stockées permettent aussi l'utilisation de bibliothèques et de fonctions sur le serveur. Les langages de programmation modernes ont déjà intégré ce type de concept, et l'utilisation de ces langages de programmation externes reste valable et utile en dehors de la base de données.
-======  ======+=====  =====
  
 Pourquoi utiliser les PS(procédures stockées)/triggers, quelques exemples en vrac : Pourquoi utiliser les PS(procédures stockées)/triggers, quelques exemples en vrac :
Ligne 16: Ligne 18:
  
 ===== Syntaxe ===== ===== Syntaxe =====
-Les procédures stockées et les fonctions sont créées avec les commandes **CREATE PROCEDURE** et **CREATE FUNCTION**. Une procédure est appelée avec la commande **CALL**, et ne peut retourner de valeur que via les variables de retour. Les fonctions peuvent retourner une valeur scalaire, et être appelées depuis une commande, tout comme toute autre fonction. Les procédures stockées peuvent appeler une autre routine stockée. Une routine est une procédure stockée ou une fonction.+Les procédures stockées et les fonctions sont créées avec les commandes **CREATE PROCEDURE** et **CREATE FUNCTION**.  
 + 
 +Une procédure est appelée avec la commande **CALL**, et ne peut retourner de valeur que via les variables de retour (à travers des variables utilisateur, précédées par @, qui sont globales dans une session et peuvent être utilisées en dehors des blocs BEGIN ... END..) 
 + 
 +Les fonctions peuvent retourner une valeur scalaire, et être appelées depuis une commande, tout comme toute autre fonction. Les procédures stockées peuvent appeler une autre routine stockée. Une routine est une procédure stockée ou une fonction.
 =====  ===== =====  =====
 +==== PROCEDURE ====
 <code> <code>
 DELIMITER // DELIMITER //
Ligne 32: Ligne 39:
 <code>CALL nomproc(valeurparam);</code> <code>CALL nomproc(valeurparam);</code>
 =====  ===== =====  =====
-==== Exemples ====+==== FONCTION====
 <code> <code>
-delimiter | +DELIMITER // 
-CREATE PROCEDURE simpleproc (OUT param1 INT+CREATE FUNCTION nomfonction(param1 TYPE, param2 TYPE, ...  
-BEGIN +RETURNS TYPE   
-   SELECT COUNT(*) INTO param1 FROM t+DETERMINISTIC   
-END +BEGIN   
-|+    -- Déclarations de variables 
 +    DECLARE variable1 TYPE; 
 + 
 +    -- Logique de la fonction 
 +    SET variable1 = ...; 
 + 
 +    -- Retourner une valeur 
 +    RETURN variable1
 +END // 
 +DELIMITER ;
 </code> </code>
-  * Que fait cette procédure ? 
-  * Appel : 
-  * Afficher le résultat : 
 =====  ===== =====  =====
 +Pour appeler la fonction, il est possible d’exécuter la requête SQL suivante:
 +
 +<code>SELECT nomfonction(valeurparam1,...);</code>
 +==== Exemples à tester ====
 <code> <code>
 delimiter | delimiter |
Ligne 50: Ligne 67:
   RETURN CONCAT('Bonjour, ',s,'!');   RETURN CONCAT('Bonjour, ',s,'!');
 |</code> |</code>
 +  * Que fait cette fonction ?
 +  * Appel :
 +  * Afficher le résultat :
 +=====  =====
 +<code>
 +delimiter |
 +CREATE PROCEDURE simpleproc (OUT param1 INT)
 +BEGIN
 +   SELECT COUNT(*) INTO param1 FROM Immeuble;
 +END
 +|
 +</code>
   * Que fait cette procédure ?   * Que fait cette procédure ?
   * Appel :   * Appel :
 +  * La tester dans le contexte "Parc immobilier" (TP Déclencheurs)
   * Afficher le résultat :   * Afficher le résultat :
 +  * Modifier cette procédure pour que le nom de la table soit géré par un paramètre en entrée (☝En MySQL, les noms de tables ne peuvent pas être passés dynamiquement comme des paramètres dans une requête SQL classique. Pour contourner cela, il faut utiliser une [[https://zestedesavoir.com/tutoriels/730/administrez-vos-bases-de-donnees-avec-mysql/952_securiser-et-automatiser-ses-actions/3954_requetes-preparees/|requête dynamique]] avec PREPARE et EXECUTE)
 =====  ===== =====  =====
 +
 ==== Autres commandes ==== ==== Autres commandes ====
 ALTER PROCEDURE | FUNCTION sp_name [characteristic ...] ALTER PROCEDURE | FUNCTION sp_name [characteristic ...]
Ligne 88: Ligne 120:
   - Définition de la fin du jeu d'enregistrement : <code> DECLARE CONTINUE HANDLER FOR NOT FOUND SET ok = 1;</code>   - Définition de la fin du jeu d'enregistrement : <code> DECLARE CONTINUE HANDLER FOR NOT FOUND SET ok = 1;</code>
   - Ouverture du curseur : on exécute la requête SELECT du curseur et on stocke le résultat dans celui-ci. <code>OPEN nom_curseur;</code>   - Ouverture du curseur : on exécute la requête SELECT du curseur et on stocke le résultat dans celui-ci. <code>OPEN nom_curseur;</code>
-  - Parcours du curseur : on parcourt une à une les lignes.<code>FETCH nom_curseur INTO variable(s);</code>+  - Parcours du curseur : on parcourt une à une les lignes. 
 +<code> 
 +tarif_loop: LOOP -- boucle pour le parcours du jeu d'enregistrement 
 +  FETCH curseur INTO var1, ...-- lecture d'une ligne du jeu d'enregistrement 
 +  IF ok = 1 THEN -- test fin du jeu d'enregistrement 
 + LEAVE tarif_loop;  
 +  END IF; 
 +  -- traitement de la ligne lue 
 +END LOOP; 
 +</code>
   - Fermeture du curseur. <code>CLOSE nom_curseur;</code>   - Fermeture du curseur. <code>CLOSE nom_curseur;</code>
  
 [[Exercice d'application]] [[Exercice d'application]]
 +
  
  
  • sio2/d4-a06-les_procedures_et_fonctions_stockees.1732198355.txt.gz
  • Dernière modification : 2024/11/21 15:12
  • de dthevenot