Outils pour utilisateurs

Outils du site


informatique:databases:mysql:procedures_et_fonctions

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édentesRévision précédente
informatique:databases:mysql:procedures_et_fonctions [2024/11/21 18:37] – supprimée - modification externe (Date inconnue) 127.0.0.1informatique:databases:mysql:procedures_et_fonctions [2024/11/21 18:37] (Version actuelle) – ↷ Page déplacée de informatique:mysql:procedures_et_fonctions à informatique:databases:mysql:procedures_et_fonctions alexis
Ligne 1: Ligne 1:
 +====== Procédures et fonctions ======
 +===== Interruption de l'exécution d'une procedure =====
 +<WRAP prewrap>
 +<code sql>
 +-- Avec l'utilisation d'une étiquette
 +CREATE PROCEDURE <nom de la procédure>()
 +this_proc:BEGIN
 +    IF <condition> THEN
 +        LEAVE this_proc;
 +    END IF;
 +    ...
 +END;
 +
 +-- Avec l'utilisation d'un bloc IF
 +CREATE PROCEDURE <nom de la procédure>()
 +BEGIN
 +    IF <condition> THEN
 +        ...
 +    END IF;
 +END;
 +</code>
 +</WRAP>
 +La première méthode est plus intéressante car elle permet de garder un code propre, même quand le nombre de d'interruption augmente.\\
 +Avec la seconde méthode, il sera nécessaire d'imbriquer de multiples blocs //IF//, le rendant moins lisible.
 +
 +===== Définition d'une procédure =====
 +
 +==== Utilisateur de création ====
 +S'il n'est pas explicitement mentionné, l'utilisateur utilisé pour la définition de la procédure sera utilisé.\\
 +Il est possible de spécifier l'utilisateur à utiliser :
 +<WRAP prewrap>
 +<code sql>
 +CREATE DEFINER = `<utilisateur>`@`<hôte>` PROCEDURE <nom de la procédure>()
 +BEGIN
 +   ...
 +END
 +</code>
 +</WRAP>
 +**Note** : il n'est pas nécessaire que l'utilisateur existe sur la base de données.
 +
 +==== Type de sécurité appliquée ====
 +Il existe 2 types de sécurité pour l'exécution des procédures :
 +  - //DEFINER// : utilise les droits de l'utilisateur utiliser pour la définition de la procédure,
 +  - //INVOKER// : utilise les droits de l'utilisateur appelant la procédure.
 +S'il n'est pas explicitement mentionné, le type de sécurité appliqué sera //DEFINER//.\\
 +Lors de la création d'une procédure, il est possible de définir le type de sécurité à appliquer.
 +<WRAP prewrap>
 +<code sql>
 +CREATE PROCEDURE <nom de la procédure>() SQL SECURITY INVOKER
 +BEGIN
 +   ...
 +END
 +</code>
 +</WRAP>
 +
 +**Note** : si l'utilisateur n'existe pas et que le type de sécurité appliquée est //DEFINER//, l'erreur suivante sera générée:
 +<WRAP prewrap>
 +<code>
 +ERROR 1449 (HY000): The user specified as a definer ('<utilisateur>'@'%') does not exist
 +</code>
 +</WRAP>
 +
 +==== Commentaires ====
 +<WRAP prewrap>
 +<code sql>
 +CREATE PROCEDURE <nom de la procédure>()
 +COMMENT '<commentaire>'
 +BEGIN
 +    ...
 +END
 +</code>
 +</WRAP>
 +
 +===== Fonctions utiles =====
 +
 +===== Ajout d'une durée normalisée à une date =====
 +Selon la norme [[https://fr.wikipedia.org/wiki/ISO_8601#Dur%C3%A9e|ISO 8601]], on peut normaliser les durées utilisées pour le calcul de dates. MySQL permet d'ajouter des durées à des dates mais en utilisant une syntaxe n'utilisant pas les durées normalisées. La fonction ((Largement inspirée de [[https://stackoverflow.com/questions/42079380/mysql-convert-iso-8601-duration-to-interval-for-date-add?rq=1|iso8601 - MySQL - Convert ISO-8601 Duration to Interval for DATE_ADD - Stack Overflow]]
 +))qui suit permet de faire ça mais uniquement pour les jours, les semaines, les mois et les années.
 +
 +<WRAP prewrap>
 +<code sql>
 +CREATE FUNCTION ADD_ISO_DURATION(StartDate DATE, Duration VARCHAR(45))
 +RETURNS DATE
 +BEGIN
 +  DECLARE Pos INTEGER;
 +
 +  IF StartDate IS NULL OR Duration IS NULL OR LENGTH(Duration) = 0 THEN
 +    RETURN StartDate;
 +  END IF;
 +
 +  IF Duration REGEXP '^P[0-9]+W$' THEN
 +    SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 2, LENGTH(Duration) - 2) WEEK);
 +    RETURN StartDate;
 +  END IF;
 +
 +  IF Duration NOT REGEXP '^P([0-9]+Y)?([0-9]+M)?([0-9]+D)?$' THEN
 +    RETURN NULL;
 +  END IF;
 +
 +  SET Duration = SUBSTR(Duration, 2);
 +
 +  SET Pos = LOCATE('Y', Duration);
 +  IF Pos <> 0 THEN
 +    SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) YEAR);
 +    SET Duration = SUBSTR(Duration, Pos + 1);
 +  END IF;
 +
 +  SET Pos = LOCATE('M', Duration);
 +  IF Pos <> 0 THEN
 +    SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) MONTH);
 +    SET Duration = SUBSTR(Duration, Pos + 1);
 +  END IF;
 +
 +  SET Pos = LOCATE('D', Duration);
 +  IF Pos <> 0 THEN
 +    SET StartDate = DATE_ADD(StartDate, INTERVAL SUBSTR(Duration, 1, Pos - 1) DAY);
 +  END IF;
 +
 +  RETURN StartDate;
 +END
 +</code>
 +</WRAP>
 +