大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
1. 简单介绍
从 MySQL 5 开始添加了对游标(cursor)的支持,使用游标可以很方便的在查询出来的结果集上获取第一行、最后一行、上一行或下一行等一系列的操作。
游标是一个存储在 MySQL 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
MySQL游标只能用于存储过程和函数中。
2. 定义和使用游标
2.1 声明游标
DECLARE cursor_name CURSOR FOR select_statement;
select_statement 的结果集对应当前定义的游标。
【注意】
这时还没有开始检索数据。select_statement 中不能有INTO子句。
2.2 打开游标
OPEN cursor_name;
在定义了游标之后就可以使用 “OPEN” 关键字打开游标,这时会执行(select_statement)查询得到结果集。
默认情况,游标的指针一开始是指向结果集的第一行之前的。
2.3 使用游标
FETCH cursor_name INTO var_name [, var_name] ...
使用 “FETCH” 和 “INTO” 关键字将当前游标所指向的记录的字段值赋值给定义好的变量中。
每执行一次 “FETCH” 语句,指针向下移动一行。
select_statement 结果集的字段数(列数)必须要和 “INTO” 后面的变量一致,否则会报错。
2.4 关闭游标
CLOSE cursor_name;
“CLOSE” 将释放游标使用的所有内部内存和资源。
如果游标未被明确地关闭,游标将在它被声明的复合语句的末尾(END)被自动关闭。
游标关闭后就不可以继续使用了,除非使用 “OPEN” 再次打开该游标。
存储过程结束后,游标也就消失了。
3. 循环游标
游标一般都是和循环语句配合使用的,否则毫无意义。循环游标有三种方式。
3.1 LOOP语句
-- LOOP语句定义
[begin_label:] LOOP
statement_list
END LOOP [end_label];
-- LOOP通常伴随着一个LEAVE语句,用于退出循环
[begin_label:] LOOP
statement
IF [condition] THEN
LEAVE [label]; -- 跳出游标循环
END IF;
statement
END LOOP [end_label];
“begin_label” 必须要指定(名称自定义);“LEAVE” 后面的 “label” 也必须要指定,且名称要和 “begin_label” 相同;“end_label” 可以指定也可以不指定,如果指定了就必须要和 “begin_label” 相同。
如果有多个 “LOOP” 语句在同一个游标中(即多个 “LOOP” 之间没有关闭并重新打开过游标),则在下一个 “LOOP” 中游标的指针是继续往下走的,而不是重新从第一行之前开始。
3.2 REPEAT语句
-- REPEAT语句定义
[begin_label:] REPEAT
statement_list
UNTIL
condition
END REPEAT [end_label];
当条件 “condition” 成立时,跳出当前循环。
“begin_label” 和 “end_label” 都可以指定或不指定,但如果指定了 “end_label” 就必须要指定 “begin_label” 且两者要相同。
3.3 WHILE语句
[begin_label:] WHILE condition DO
statement_list
END WHILE [end_label];
当条件 “condition” 不成立时,退出当前循环。
“begin_label” 和 “end_label” 都可以指定或不指定,但如果指定了 “end_label” 就必须要指定 “begin_label” 且两者要相同。
4. 游标溢出
循环游标时,游标本身是不会监控是否到最后一条数据了,当游标已经指向最后一行时继续执行就会造成游标溢出。
游标溢出时会引发 MySQL 预定义的 “NOT FOUND”(也叫 “SQLSTATE ‘02000’ ”)错误。
下面以 WHILE 循环作为一个示例:
DECLARE done INT DEFAULT true; -- 定义变量
DECLARE cursor_name CURSOR FOR select_statement; -- 定义游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = false; -- 溢出处理
-- 或: DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = FALSE;
WHILE done DO
FETCH cursor_name INTO var_name [, var_name] ...
END WHILE;
【注意】
溢出处理必须定义在游标声明之后。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/209926.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...