MySQL nous offre la possibilité de créer des procédures stockées . Les procédures stockées sont une partie puissante de MySQL (et d'autres systèmes de gestion de bases de données, tels que SQL Server) et elles vous permettent de faire plus que les vues.
Une procédure stockée est une collection d'instructions SQL stockées dans la base de données. Une procédure stockée peut contenir une logique métier, qui est l'un des aspects clés qui distingue les procédures stockées des vues. Une procédure stockée peut accepter des paramètres, et vous pouvez définir des variables, écrire IF
instructions, etc. dans une procédure stockée.
Comment fonctionnent les procédures stockées ?
Tout d'abord, vous créez la procédure stockée. Puis une fois qu'il a été créé, vous pouvez le lancer (ou plus précisément, vous "l'appelez").
Pour exécuter une procédure stockée, vous "l'appelez". Lorsque vous l'appelez, vous fournissez également tous les paramètres dont il pourrait avoir besoin. La procédure stockée s'exécutera ensuite, en utilisant vos paramètres de la manière spécifiée par le code.
Par exemple, vous pouvez écrire une procédure stockée qui accepte un FruitId
paramètre. La procédure stockée pourrait alors prendre ce paramètre et l'utiliser pour vérifier l'inventaire de ce fruit particulier. Par conséquent, vous pouvez appeler la procédure stockée, à chaque fois avec un ID de fruit différent et elle renverra une valeur qui vous indique la quantité de ce fruit en stock.
Créer une procédure stockée
Les procédures stockées sont créées à l'aide de CREATE PROCEDURE
déclaration.
Syntaxe
Voici la syntaxe pour créer une procédure stockée :
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
Remplacer sp_name avec le nom que vous souhaitez utiliser pour la procédure stockée. Les parenthèses sont obligatoires — elles entourent tous les paramètres. Si aucun paramètre n'est requis, les parenthèses peuvent être vides.
Le corps principal de la procédure stockée se situe entre le BEGIN
et END
mots clés. Ces mots clés sont utilisés pour écrire des instructions composées. Une instruction composée peut contenir plusieurs instructions, et celles-ci peuvent être imbriquées si nécessaire. Par conséquent, vous pouvez imbriquer BEGIN
et END
blocs.
Dans la plupart des cas, vous devrez également entourer le CREATE PROCEDURE
instruction avec DELIMITER
commandes et modifier END;
à END //
. Comme ceci :
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
J'expliquerai pourquoi bientôt, mais pour l'instant, regardons un exemple.
Exemple
Voici un exemple simple de création d'une procédure stockée. Exécuter le code suivant sur notre FruitShop la base de données créera une procédure stockée appelée spCheckFruitStock :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Nous pouvons maintenant appeler cette procédure stockée comme ceci :
CALL spCheckFruitStock(1);
Ici, nous passons un paramètre de 1
qui est l'ID pour
Apple
.
Voici le résultat :
Nous pouvons faire de même pour n'importe quel fruit de notre base de données, simplement en changeant le paramètre passé à la procédure stockée.
À propos du DELIMITER
Commande
Dans l'exemple ci-dessus, nous avons ajouté quelques DELIMITER
commandes et nous avons remplacé un point-virgule par deux barres obliques. Que se passe-t-il ici ?
Nous avons fait cela pour dire à MySQL d'utiliser un délimiteur différent pendant qu'il crée notre procédure stockée.
La raison en est que MySQL reconnaît déjà le point-virgule comme délimiteur pour marquer la fin de chaque instruction SQL. Par conséquent, dès que MySQL verra le premier point-virgule, il interprétera le délimiteur comme tel et notre procédure stockée se cassera.
Le DELIMITER
La commande nous permet de dire à MySQL d'utiliser un délimiteur différent. Dans l'exemple ci-dessus, nous définissons ceci sur deux barres obliques (//
) mais cela aurait pu être n'importe quoi (cependant, évitez d'utiliser une barre oblique inverse (\
) car c'est le caractère d'échappement pour MySQL). En modifiant le délimiteur, MySQL n'essaiera pas d'interpréter nos points-virgules comme la fin de l'instruction ; il attendra de voir les deux barres obliques.
Une fois que nous avons créé la procédure stockée, nous pouvons utiliser DELIMITER ;
pour remettre le délimiteur au point-virgule.
Supprimer une procédure stockée
Vous pouvez supprimer une procédure stockée en utilisant le DROP PROCEDURE
déclaration. Comme ceci :
DROP PROCEDURE spCheckFruitStock;
Modification d'une procédure stockée
Vous pouvez modifier certains aspects d'une procédure stockée en utilisant la ALTER PROCEDURE
déclaration.
Cependant, pour modifier le corps de la procédure stockée ou l'un de ses paramètres, vous devez supprimer la procédure et la recréer. Comme ceci :
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Ici, nous avons ajouté Fruit.FruitId
à la liste des colonnes à retourner.
Résultat :
Une procédure stockée plus avancée
L'exemple ci-dessus était simple afin de démontrer la syntaxe de création et d'appel de procédures stockées. Regardons une procédure stockée un peu plus complexe :
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel; DELIMITER // CREATE PROCEDURE spCheckFruitStockLevel( IN pFruitId SMALLINT(5), OUT pStockLevel VARCHAR(6)) BEGIN DECLARE stockNumber SMALLINT; SELECT Fruit.Inventory into stockNumber FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = pFruitId; IF stockNumber > 10 THEN SET pStockLevel = 'High'; ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN SET pStockLevel = 'Medium'; ELSEIF (stockNumber < 5) THEN SET pStockLevel = 'Low - Please Replace Now!'; END IF; END // DELIMITER ;
L'exemple ci-dessus accepte deux modes différents de paramètres (IN
et OUT
). IN
est la valeur par défaut, c'est pourquoi l'exemple précédent n'incluait pas le mode.
Ici, nous définissons également une variable. Nous utilisons DECLARE stockNumber SMALLINT
pour déclarer une variable appelée stockNumber
avec un type SMALLINT
(petit entier).
Nous utilisons un SELECT
déclaration pour rechercher l'inventaire pour l'ID de fruit donné et l'affecter à notre stockNumber
variables.
Enfin, nous utilisons un SQL IF
déclaration pour déterminer le niveau de stock, en plaçant cette valeur dans le pStockLevel
paramètre (qui est bien sûr le OUT
paramètre - c'est la valeur que nous verrons lorsque nous appellerons la procédure stockée).
Appeler une procédure stockée avec un OUT
ou INOUT
Paramètre
Dans notre dernier exemple, nous avons spécifié deux paramètres, un IN
paramètre et un OUT
paramètre.
Lorsque nous appelons cette procédure stockée, nous devons toujours inclure le OUT
paramètre. Cependant, comme nous ne connaîtrons pas sa valeur (après tout, c'est pourquoi nous l'appelons — pour connaître sa valeur !), nous devrons utiliser une variable. Ensuite, nous pouvons utiliser un SELECT
pour connaître sa valeur.
Comme ceci :
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
Résultat :
Modes de paramètres
Nous venons d'utiliser deux modes de paramètres (IN
et OUT
). Dans MySQL, il existe trois modes de paramètres qui peuvent être utilisés avec les procédures stockées.
- EN
- Lorsque vous utilisez ce mode paramètre, vous (ou votre application) devez transmettre la valeur du paramètre lorsque vous appelez la procédure stockée. Ces paramètres sont protégés. Par conséquent, sa valeur d'origine est conservée après l'exécution de la procédure stockée. Si la procédure stockée modifie la valeur, elle ne le fait que sur une copie du paramètre.
Ce mode est le mode par défaut. Si vous ne fournissez pas le paramètre mode, ce sera
IN
. - OUT
- La valeur d'un
OUT
Le paramètre peut changer dans la procédure stockée et sa valeur est renvoyée à l'application appelante. - INOUT
- Ce mode est une combinaison du
IN
etOUT
modes. Vous pouvez transmettre la valeur initiale, la procédure stockée peut la modifier et elle renverra la nouvelle valeur à l'application appelante.