Maison > Article > base de données > MySQL utilise des procédures stockées
MySQL est actuellement le système de gestion de bases de données relationnelles le plus populaire. Il utilise des procédures stockées pour mieux maintenir et gérer l'exécution des instructions et des programmes SQL. Les procédures stockées sont des blocs de code SQL précompilés qui peuvent encapsuler des instructions SQL couramment utilisées pour améliorer l'efficacité lors de plusieurs exécutions et réduire l'utilisation des ressources d'exécution.
Utilisation de procédures stockées dans MySQL
1. Créer des procédures stockées
Fondamentalement parlant, créer une procédure stockée consiste à écrire un bloc d'instructions SQL et à enregistrer ce bloc de code dans la base de données système. Voici un exemple spécifique :
CREATE PROCEDURE `procedure_name` (`parameter_list`) BEGIN -- SQL 语句块 END
Parmi eux, procedure_name
est le nom de la procédure stockée, paramter_list
est la liste des paramètres de la procédure stockée, qui peut inclure une entrée paramètres et paramètres de sortie, ainsi que Ne peut contenir aucun paramètre. procedure_name
是存储过程的名称,paramter_list
是存储过程的参数列表,可以包括入参、出参,也可以不包含参数。
例如,我们创建一个获取用户信息的存储过程:
CREATE PROCEDURE `get_user_info`(user_id INT) BEGIN SELECT * FROM `user` WHERE `user_id` = user_id; END
在存储过程的 SQL 语句块中,我们可以使用 MySQL 支持的所有 SQL 语句,如 SELECT、INSERT、UPDATE、DELETE 等,还可以使用控制流语句,例如 IF、WHILE、LOOP 等,从而实现更复杂的数据逻辑处理。
2、调用存储过程
创建存储过程之后,我们可以通过 CALL 语句来调用存储过程,并向其传递参数:
CALL procedure_name(param1, param2, ...)
例如,我们可以按如下方式调用上面定义的 get_user_info
存储过程:
CALL `get_user_info`(1);
3、删除存储过程
如果随着时间的推移,一个存储过程已经不再需要,可以使用 DROP PROCEDURE 语句删除它:
DROP PROCEDURE `procedure_name`;
例如:
DROP PROCEDURE `get_user_info`;
4、存储过程实例
我们来看一个完整的存储过程实例。假设我们有一个 score
表,存储了学生的考试成绩,而我们需要计算出每个学生的总分、平均分,并按照总分从高到低排列。这时可以使用存储过程来实现:
CREATE PROCEDURE `calc_stu_score`() BEGIN DECLARE `total_score` INT; DECLARE `avg_score` FLOAT; DECLARE `stu_id` INT DEFAULT 0; DECLARE `stu_name` VARCHAR(255); DECLARE `total` INT DEFAULT 0; DECLARE `cursor_stu_id` CURSOR FOR SELECT `stu_id` FROM `score` GROUP BY `stu_id`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE; DROP TEMPORARY TABLE IF EXISTS `tmp_score`; CREATE TEMPORARY TABLE `tmp_score` ( `stu_id` INT NOT NULL, `stu_name` VARCHAR(255) NOT NULL, `total_score` INT NOT NULL, `avg_score` FLOAT NOT NULL, PRIMARY KEY (`stu_id`) ); OPEN cursor_stu_id; stu_loop: LOOP FETCH cursor_stu_id INTO stu_id; IF finished = TRUE THEN LEAVE stu_loop; END IF; SELECT `name` INTO stu_name FROM `student` WHERE `stu_id` = stu_id; SELECT SUM(`sorce`), COUNT(*) INTO total_score, total FROM `score` WHERE `stu_id` = stu_id; SET avg_score = total_score / NULLIF(total, 0); INSERT INTO `tmp_score` (`stu_id`, `stu_name`, `total_score`, `avg_score`) VALUES (stu_id, stu_name, total_score, avg_score); END LOOP; CLOSE cursor_stu_id; SELECT * FROM `tmp_score` ORDER BY `total_score` DESC; DROP TEMPORARY TABLE `tmp_score`; END
在这个存储过程中,我们首先定义了一些需要使用的变量,包括 total_score
表示某个学生的总分,avg_score
表示某个学生的平均分,stu_id
表示某个学生的编号,stu_name
表示某个学生的姓名,还有一个临时表 tmp_score
。
然后我们使用了 DECLARE CURSOR
语句声明了一个游标变量 cursor_stu_id
,用于查询学生表中的学生编号。在循环中,我们根据这个学生编号查询成绩表,计算出该学生的总分和平均分,并将其保存到临时表中。最后,我们使用 SELECT
语句查询临时表,按照总分从高到低排序,并在最后使用 DROP TABLE
语句删除临时表。
最后,我们可以使用 CALL
CALL `calc_stu_score`();Dans le bloc d'instructions SQL de la procédure stockée, nous pouvons utiliser toutes les instructions SQL prises en charge par MySQL, telles que SELECT, INSERT, UPDATE, DELETE, etc. , et nous pouvons également utiliser des instructions de contrôle Stream, telles que IF, WHILE, LOOP, etc., pour réaliser un traitement logique de données plus complexe. 2. Appelez la procédure stockée🎜🎜Après avoir créé la procédure stockée, nous pouvons appeler la procédure stockée via l'instruction CALL et lui transmettre des paramètres : 🎜rrreee🎜Par exemple, nous pouvons appeler le
get_user_info défini ci-dessus comme suit le code> Procédure stockée : 🎜rrreee🎜3. Supprimer la procédure stockée🎜🎜Si une procédure stockée n'est plus nécessaire au fil du temps, vous pouvez utiliser l'instruction DROP PROCEDURE pour la supprimer : 🎜rrreee🎜Par exemple : 🎜rrreee🎜4. Exemple de procédure stockée🎜🎜Jetons un coup d'œil à un exemple complet de procédure stockée. Supposons que nous ayons un tableau de <code>score
qui stocke les résultats des tests des étudiants, et que nous devions calculer le score total et le score moyen de chaque élève, et les classer de haut en bas en fonction du score total. Ceci peut être réalisé à l'aide d'une procédure stockée : 🎜rrreee🎜Dans cette procédure stockée, nous définissons d'abord certaines variables qui doivent être utilisées, notamment total_score
qui représente le score total d'un élève, et avg_score représente le score moyen d'un certain élève, <code>stu_id
représente le numéro d'un certain élève, stu_name
représente le nom d'un certain élève, et il y a aussi un temporaire tableau tmp_score
. 🎜🎜Ensuite, nous avons utilisé l'instruction DECLARE CURSOR
pour déclarer une variable de curseur cursor_stu_id
, qui est utilisée pour interroger le numéro d'étudiant dans la table des étudiants. Dans la boucle, nous interrogeons le tableau des scores en fonction de ce numéro d'élève, calculons le score total et le score moyen de l'élève et les enregistrons dans un tableau temporaire. Enfin, nous utilisons l'instruction SELECT
pour interroger la table temporaire, trier le score total de haut en bas, et enfin utiliser l'instruction DROP TABLE
pour supprimer la table temporaire. 🎜🎜Enfin, nous pouvons utiliser l'instruction CALL
pour appeler cette procédure stockée : 🎜rrreee🎜Résumé🎜🎜La procédure stockée est un outil très puissant dans MySQL, qui peut grandement simplifier et améliorer notre processus de fonctionnement de base de données. performances et sécurité des bases de données. Dans les applications pratiques, nous pouvons utiliser des procédures stockées pour effectuer de nombreuses opérations de traitement de données complexes afin de mieux répondre aux besoins de l'entreprise, d'améliorer l'efficacité et de réduire les coûts. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!