目录
在本文中,我们将学习使用MySQL游标和for循环,它们的功能类似于一般编程中的迭代循环。我们还将介绍变量、游标和处理程序声明。
考虑一般编程中的循环。它们帮助您重复执行特定的指令序列,直到特定条件中断循环。MySQL还提供了一种使用游标在各个行上执行指令的方法。MySQL中的游标将对SQL查询返回的行执行一组指令。
MySQL游标的属性
- 不可滚动:您只能在一个方向上遍历行。你不能跳过一行;你不能跳到一行;你不能回到一行。
- 只读:您不能使用游标更新或删除行。
- Asensitive:MySQL游标指向底层数据。它比不敏感的游标运行得更快。不敏感游标指向基础数据的快照,使其比敏感游标慢。
创建MySQL游标
要创建MySQL游标,您需要使用DECLARE、OPEN、FETCH和CLOSE语句。
声明语句
该DECLARE语句可以声明变量、游标和处理程序。有一系列声明需要遵守:
- 变量
- 游标
- 处理程序
您必须首先声明至少一个变量,以便稍后与该FETCH语句一起使用。
DECLARE <variable_name> <variable_type>
DECLARE <variable_name> <variable_type>
声明一个变量
声明游标时,必须附加一条SELECT语句。任何有效SELECT的声明都会起作用。您还必须声明至少一个游标。
DECLARE <cursor_name> CURSOR FOR <select_statement>
为 SELECT语句声明游标
您还必须声明一个NOT FOUND处理程序。当游标迭代并到达最后一行时,它会引发一个将由NOT FOUND处理程序处理的条件。您还可以根据需要声明其他处理程序。例如:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
使用NOT FOUND处理程序
公开声明
该OPEN语句初始化DECLARE游标语句的结果。
OPEN <cursor_name>
OPEN语句语法
Fetch语句
该FETCH语句用作迭代器。它从与游标声明中的SELECT语句关联的行中获取下一行。
FETCH <cursor_name> INTO <variable_list>
FETCH语句语法
<variable_list>是前面声明的变量中的一个或多个变量。
FETCH <cursor_name> INTO a, b, c
示例变量列表
如果下一行存在,则变量存储它;否则,会出现带有SQLSTATE“02000”的无数据条件。你可以使用NOT FOUND处理程序来处理这个SQLSTATE。
关闭声明
此语句关闭在`OPEN`语句中打开的游标。
CLOSE <cursor_name>
CLOSE语句语法
使用MySQL游标
准备好开始使用MySQL游标了吗?首先,您需要创建一个数据库和一个表。在此演示中,我们将使用此CSV文件中的数据填充一个表。
我们将创建一个游标:
- 循环遍历football表
- 计算赢得比赛的主队在中场休息时的平均进球数
这是完成此操作的MySQL过程的样子。
MySQL存储过程
DELIMITER $$ CREATE PROCEDURE cursordemo(INOUT average_goals FLOAT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE matches int DEFAULT(0);
DECLARE goals int DEFAULT(0);
DECLARE half_time_goals INT;
DECLARE team_cursor CURSOR FOR
SELECT
HTHG
FROM
epl.football
WHERE
(FTR = "H");
DECLARE
CONTINUE HANDLER FOR NOT FOUND
SET
done = TRUE;
OPEN team_cursor;
teams_loop:
LOOP
FETCH team_cursor INTO half_time_goals;
IF done THEN LEAVE teams_loop;
END IF;
SET
goals = goals + half_time_goals;
SET
matches = matches + 1;
END
LOOP
teams_loop;
SET
average_goals = goals / matches;
CLOSE team_cursor;
END $$ DELIMITER;
MySQL存储过程
MySQL中的存储过程就像一个包含一系列指令的容器。存储过程用MySQL编写并存储在数据库中。我们在过程中定义游标,因为过程是可重用的。执行上面的SQL存储过程会将过程存储在数据库中。我们可以使用它的名字来调用这个过程,如下所示:
SET @average_goals = 0.0;
CALL cursordemo(@average_goals);
SELECT @average_goals;
执行我们刚刚创建的存储过程
此操作的输出是:
1.080954670906067
MySQL游标的注意事项
仔细看一下这个例子可以看出,类似的SQL查询SELECT AVG(HTHG) FROM epl.football WHERE (FTR="H");将获得相同的结果。最好在一次处理一行时只使用游标。例如完整性检查、索引重建。请注意,每次游标获取一行时,都会导致网络往返。因此,它最终可能会减慢MySQL服务器的速度,具体取决于操作的规模。
结论
在本文中,我们了解了如何使用MySQL游标和for循环,它们的功能类似于一般编程中的迭代循环。我们还介绍了变量、游标和处理程序声明。
使用游标的计算成本可能很高。当MySQL没有提供任何其他方式来使用标准查询或用户定义的函数来实现相同的结果时,最好只使用它们。但是,如果是这样的话,它们是非常强大的工具。
https://www.codeproject.com/Articles/5317993/Using-Cursors-and-for-Loops-in-MySQL