Mysql
 sql >> Base de données >  >> RDS >> Mysql

Procédures stockées MySQL

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 et OUT modes. Vous pouvez transmettre la valeur initiale, la procédure stockée peut la modifier et elle renverra la nouvelle valeur à l'application appelante.