Les procédures stockées sont des instructions SQL définies par l'utilisateur qui sont stockées dans une base de données MySQL et exécutées à la demande pour effectuer une opération de base de données spécifique. Ces sous-routines prédéfinies aident à déplacer la logique métier vers la base de données, ce qui offre quelques avantages :
- Les allers-retours effectués vers le serveur de base de données par une application sont minimisés.
- La maintenabilité du code est améliorée, puisque différentes applications peuvent partager la procédure stockée.
- Les performances de la base de données sont améliorées, car les procédures stockées sont compilées une seule fois et exécutées très rapidement et efficacement.
Dans ce guide, vous allez :
-
Apprenez la syntaxe pour créer des procédures stockées et déclarez votre première procédure.
-
Exécutez l'exemple de procédure après l'avoir déclaré.
-
Découvrez comment supprimer une procédure lorsque vous n'en avez plus besoin.
Avant de commencer
Assurez-vous d'avoir les éléments suivants :
-
Si vous ne l'avez pas déjà fait, créez un compte Linode et une instance de calcul. Consultez nos guides Premiers pas avec Linode et Création d'une instance de calcul.
-
Suivez notre guide Configuration et sécurisation d'une instance de calcul pour mettre à jour votre système. Vous pouvez également définir le fuseau horaire, configurer votre nom d'hôte, créer un compte utilisateur limité et renforcer l'accès SSH.
-
Un serveur et un client MySQL installés sur le serveur Linode. Des guides d'installation pour MySQL sont disponibles pour différentes distributions dans notre section MySQL.
Préparer la base de données
Vous commencerez par créer un exemple de base de données, une table et un utilisateur pour accéder à la base de données. Vous remplirez également le tableau avec des exemples de données à des fins de test.
Création de la base de données, de la table et de l'utilisateur
-
Connectez-vous au serveur MySQL :
mysql -u root -p
Vous serez invité à entrer le mot de passe root de votre base de données MySQL. Appuyez ensuite sur Entrée pour continuer.
-
Ensuite, vous verrez une invite MySQL similaire à celle illustrée ci-dessous.
mysql >
-
Entrez la commande ci-dessous pour créer un
test_db
base de données :CREATE DATABASE test_db;
Sortie :
Query OK, 1 row affected (0.01 sec)
-
Créez un utilisateur de base de données et accordez un accès complet à
test_db
base de données. RemplacezPASSWORD
avec une valeur complexe et unique qui suit les directives pour les mots de passe MySQL :CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Sortie :
Query OK, 1 row affected (0.01 sec)
-
Accordez le
test_user
privilèges complets surtest_db
base de données ;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Sortie :
Query OK, 1 row affected (0.01 sec)
-
Privilèges de vidage :
FLUSH PRIVILEGES;
Sortie :
Query OK, 0 rows affected (0.01 sec)
Remplir la base de données
-
Passez ensuite à la base de données test_db :
USE test_db;
Sortie :
Database changed
-
Créer un
products
table pour stocker des exemples d'enregistrements :CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Sortie :
Query OK, 0 rows affected (0.01 sec)
-
Vous pouvez maintenant ajouter quelques produits à la table des produits en exécutant les commandes ci-dessous une par une :
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
Vous devriez obtenir la sortie ci-dessous après avoir exécuté chaque
Insert
déclaration :Query OK, 1 row affected (0.00 sec)
-
Suivant. confirmez si les exemples de produits ont été insérés avec succès dans la base de données en exécutant la commande
Select
commande ci-dessous :SELECT * FROM products;
Vos exemples de produits doivent être répertoriés comme indiqué ci-dessous :
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
Quittez le serveur MySQL.
QUIT;
Sortie :
Bye!
-
Une fois que vous avez créé un
test_db
base de données,products
table, untest_user
, et ajouté quelques exemples de produits, vous pouvez maintenant passer à la création de la première procédure stockée.
Création d'une procédure stockée
Syntaxe de procédure stockée
La syntaxe de base de la création d'une procédure stockée dans la base de données MySQL est illustrée ci-dessous :
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
Le
DELIMITER &&
La ligne au début indique au serveur MySQL de traiter les instructions SQL suivantes comme une seule instruction, plutôt que de les exécuter individuellement. Un autre&&
est inclus sur une ligne ultérieure pour marquer la fin de cette instruction. -
PROCEDURE_NAME
est l'endroit où le nom de votre procédure stockée est déclaré. -
Le nom de la procédure est suivi d'un ensemble de parenthèses, qui renferment les paramètres de votre procédure. Les procédures stockées prennent en charge les paramètres séparés par des virgules, et cette fonctionnalité les rend plus flexibles. Voir la section paramètres pour plus de détails.
-
Le
BEGIN...END
Les commandes incluent l'instruction SQL que vous souhaitez exécuter par la procédure stockée. -
Au final, l'instruction
DELIMITER ;
est émis à nouveau pour remettre le délimiteur à la valeur par défaut de;
Paramètres de procédure stockée
Chaque paramètre d'une procédure a un type, un nom et un type de données, séparés par des espaces :
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Par exemple, pour créer un paramètre de type IN
, nommé category
, avec le VARCHAR
type de données d'une longueur de 50 caractères, utilisez cette syntaxe :
IN category VARCHAR(50)
MySQL prend en charge trois types de paramètres :
-
IN
:La valeur du paramètre doit être spécifiée par le client appelant. Cette valeur ne peut pas être modifiée par la procédure stockée .Par exemple, si vous passez une variable de session MySQL en tant que
IN
paramètre à une procédure et que la procédure modifie cette valeur dans ses instructions, votre variable de session restera inchangée après la sortie de la procédure. -
OUT
:Ce type de paramètre est également spécifié par le programme appelant, mais sa valeur peut être modifiée par la procédure stockée et récupérée par le programme appelant.Notez que la procédure stockée ne peut pas accéder à la valeur initiale d'une variable qui est passée en tant que
OUT
paramètre. -
INOUT
:Un paramètre de ce type combine les comportements deIN
etOUT
paramètres :-
La procédure stockée peut lire la valeur initiale du paramètre.
-
Le paramètre peut être modifié pendant l'exécution de la procédure stockée.
-
La valeur modifiée peut être renvoyée au programme appelant, si le programme appelant a passé une variable en tant que paramètre.
-
Un exemple de procédure stockée
Après avoir compris la syntaxe de base, créons une procédure stockée simple pour filtrer les produits par nom de catégorie. Le nom de la catégorie sera fourni sous la forme d'un IN
paramètre.
-
Connectez-vous au serveur MySQL en utilisant le
test_user
les informations d'identification de que vous avez créées lors de la préparation de la base de données :mysql -u test_user -p
-
Saisissez le mot de passe du
test_user
et appuyez sur Entrée pour continuer. -
Vous obtiendrez un
mysql >
rapide. Continuez en sélectionnant letest_db
:USE test_db;
Sortie :
Database changed.
-
Ensuite, entrez les commandes SQL ci-dessous pour créer un
filter_by_category
procédure stockée :DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Sortie :
Query OK, 0 rows affected (0.00 sec)
-
Changez le
DELIMITER
retour à;
DELIMITER ;
-
Si le code de création de la procédure stockée s'est exécuté avec succès, vous pouvez maintenant passer à l'exécution de la procédure stockée.
Exécuter une procédure stockée
Dans cette étape, nous appellerons la procédure stockée que nous avons créée ci-dessus. Nous suivrons cette syntaxe de base :
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Pour exécuter le
filter_by_category
procédure stockée que nous avons créée ci-dessus, entrez la commande ci-dessous :CALL filter_by_category('COMPUTER ACCESSORIES');
La procédure stockée devrait maintenant afficher tous les produits dans les
COMPUTER ACCESSORIES
catégorie parce que nous avons spécifiéCOMPUTER ACCESSORIES
en paramètre :+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
De même, vous pouvez récupérer une liste de tous les produits de la rubrique
ELECTRONICS
catégorie en exécutant la commande ci-dessous.CALL filter_by_category('ELECTRONICS') ;
Sortie :
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Notre procédure stockée a fonctionné comme prévu. Ensuite, nous apprendrons comment supprimer les procédures stockées si nous ne voulons plus qu'elles s'exécutent à nouveau.
Supprimer des procédures stockées
Vous pouvez supprimer une procédure stockée MySQL si vous ne souhaitez plus l'utiliser ou si vous souhaitez la recréer à partir de zéro. La syntaxe de base de la suppression de la procédure stockée est illustrée ci-dessous :
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Par exemple, pour supprimer notre filter_by_category
procédure stockée, exécutez la commande MySQL ci-dessous :
DROP PROCEDURE IF EXISTS filter_by_category;
Si la procédure stockée existe, vous obtiendrez la sortie ci-dessous :
Query OK, 0 rows affected (0.00 sec)
C'est tout quand il s'agit de créer, d'utiliser et de supprimer des procédures stockées MySQL.
Plus d'informations
Vous pouvez consulter les ressources suivantes pour plus d'informations sur ce sujet. Bien que ceux-ci soient fournis dans l'espoir qu'ils seront utiles, veuillez noter que nous ne pouvons pas garantir l'exactitude ou l'actualité des documents hébergés en externe.
- Travailler avec les procédures stockées MySQL