MySQL ist derzeit das beliebteste relationale Datenbankverwaltungssystem. Es verwendet gespeicherte Prozeduren, um die Ausführung von SQL-Anweisungen und -Programmen besser zu verwalten und zu verwalten. Gespeicherte Prozeduren sind vorkompilierte SQL-Codeblöcke, die häufig verwendete SQL-Anweisungen kapseln können, um die Effizienz bei mehreren Ausführungen zu verbessern und die Ressourcennutzung zur Laufzeit zu reduzieren.
Die Verwendung gespeicherter Prozeduren in MySQL
1. Erstellen Sie eine gespeicherte Prozedur
Grundsätzlich besteht das Erstellen einer gespeicherten Prozedur darin, eine SQL-Anweisung zu schreiben block und speichern Sie diesen Codeblock in der Systemdatenbank. Das Folgende ist ein konkretes Beispiel:
CREATE PROCEDURE `procedure_name` (`parameter_list`) BEGIN -- SQL 语句块 END
Wobei procedure_name
der Name der gespeicherten Prozedur ist, ist paramter_list
die Parameterliste der gespeicherten Prozedur , die Parameter, Parameter oder keine Parameter enthalten können. 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`();
get_user_info
wie folgt aufrufen: #🎜🎜#rrreee#🎜🎜#3. Löschen Sie die gespeicherte Prozedur #🎜🎜##🎜🎜#Wenn vorbei Wenn eine gespeicherte Prozedur im Laufe der Zeit nicht mehr benötigt wird, können Sie sie mit der DROP PROCEDURE-Anweisung löschen: #🎜🎜#rrreee#🎜🎜#Zum Beispiel: #🎜🎜#rrreee#🎜🎜#4, gespeicherte Prozedurinstanz #🎜🎜##🎜🎜 #Sehen wir uns ein vollständiges Beispiel einer gespeicherten Prozedur an. Angenommen, wir haben eine score
-Tabelle, in der die Testergebnisse der Schüler gespeichert sind, und wir müssen die Gesamtpunktzahl und die durchschnittliche Punktzahl jedes Schülers berechnen und sie entsprechend der Gesamtpunktzahl von hoch nach niedrig ordnen. Zu diesem Zeitpunkt können Sie eine gespeicherte Prozedur verwenden, um Folgendes zu erreichen: #🎜🎜#rrreee#🎜🎜#In dieser gespeicherten Prozedur definieren wir zunächst einige Variablen, die verwendet werden müssen, einschließlich total_score
zur Darstellung von a Gesamtpunktzahl des Schülers, avg_score
stellt die durchschnittliche Punktzahl eines bestimmten Schülers dar, stu_id
stellt die Nummer eines bestimmten Schülers dar, stu_name
stellt den Namen eines bestimmten Schülers dar bestimmter Schüler, und es gibt eine temporäre Tabelle tmp_score
. #🎜🎜##🎜🎜#Dann haben wir mit der Anweisung DECLARE CURSOR
eine Cursorvariable cursor_stu_id
für die Abfrage der Studierendennummer in der Studierendentabelle deklariert. In der Schleife fragen wir die Punktetabelle basierend auf dieser Schülernummer ab, berechnen die Gesamtpunktzahl und die Durchschnittspunktzahl des Schülers und speichern sie in einer temporären Tabelle. Schließlich verwenden wir die Anweisung SELECT
, um die temporäre Tabelle abzufragen, sortieren die Gesamtpunktzahl von hoch nach niedrig und verwenden schließlich die Anweisung DROP TABLE
, um die temporäre Tabelle zu löschen. #🎜🎜##🎜🎜#Schließlich können wir die Anweisung CALL
verwenden, um diese gespeicherte Prozedur aufzurufen: #🎜🎜#rrreee#🎜🎜#Zusammenfassung#🎜🎜##🎜🎜#Die gespeicherte Prozedur ist MySQL Es ist ein sehr leistungsfähiges Tool, das unseren Datenbankbetriebsprozess erheblich vereinfachen und die Leistung und Sicherheit der Datenbank verbessern kann. In praktischen Anwendungen können wir gespeicherte Prozeduren verwenden, um viele komplexe Datenverarbeitungsvorgänge abzuschließen, um Geschäftsanforderungen besser zu erfüllen, die Effizienz zu verbessern und Kosten zu senken. #🎜🎜#Das obige ist der detaillierte Inhalt vonMySQL verwendet gespeicherte Prozeduren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!