Outils pour utilisateurs

Outils du site


informatique:databases:mysql:procedures_et_fonctions

Procédures et fonctions

Interruption de l'exécution d'une procedure

-- 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;

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 :

CREATE DEFINER = `<utilisateur>`@`<hôte>` PROCEDURE <nom de la procédure>()
BEGIN
   ...
END

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 :

  1. DEFINER : utilise les droits de l'utilisateur utiliser pour la définition de la procédure,
  2. 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.

CREATE PROCEDURE <nom de la procédure>() SQL SECURITY INVOKER
BEGIN
   ...
END

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:

ERROR 1449 (HY000): The user specified as a definer ('<utilisateur>'@'%') does not exist

Commentaires

CREATE PROCEDURE <nom de la procédure>()
COMMENT '<commentaire>'
BEGIN
    ...
END

Fonctions utiles

Ajout d'une durée normalisée à une date

Selon la norme 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 1)qui suit permet de faire ça mais uniquement pour les jours, les semaines, les mois et les années.

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
informatique/databases/mysql/procedures_et_fonctions.txt · Dernière modification : 2024/11/21 18:37 de alexis