-- 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.
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.
Il existe 2 types de sécurité pour l'exécution des procédures :
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
CREATE PROCEDURE <nom de la procédure>() COMMENT '<commentaire>' BEGIN ... END
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