MySQL游标(cursor)定义及使用
提到MySQL游标,多半在存储过程中定义及使用。
以下说明摘自MySQL官网:
MySQL 支持存储程序中的游标。语法与嵌入式 SQL 中的一样。游标具有以下属性:
- 不敏感:服务器可能会也可能不会复制其结果表
- 只读:不可更新
- 不可滚动:只能单向遍历,不能跳行
游标声明必须出现在处理程序声明之前以及变量和条件声明之后。
游标申明语法:
DECLARE cursor_name CURSOR FOR select_statement
cursor_name:定义的游标名称
select_statement:SQL查询语句
此语句声明一个游标并将其与 SELECT检索要由游标遍历的行的语句相关联。要稍后获取行,请使用FETCH语句。语句检索的列数 SELECT必须与语句中指定的输出变量数相匹配 FETCH。
该SELECT语句不能有
INTO
子句。游标声明必须出现在处理程序声明之前以及变量和条件声明之后。
存储的程序可能包含多个游标声明,但在给定块中声明的每个游标必须具有唯一的名称。
对于通过 SHOW语句可用的信息,在许多情况下可以通过将游标与
INFORMATION_SCHEMA
表一起使用来获得等效信息。
Cursor FETCH语法:
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
此语句获取与指定游标(必须打开)关联的语句的下一行 SELECT,并推进游标指针。如果存在一行,则提取的列存储在命名变量中。语句检索的列数 SELECT必须与语句中指定的输出变量数相匹配 FETCH。
如果没有更多行可用,则出现 No Data 条件,SQLSTATE value
'02000'
。要检测此条件,您可以为其(或条件)设置一个处理程序NOT FOUND
。请注意,另一个操作(例如 a
SELECT
或 anotherFETCH
)也可能通过引发相同条件来导致处理程序执行。如果有必要区分哪个操作引发了条件,请将该操作放在它自己的 BEGIN ... END块中,以便它可以与它自己的处理程序相关联。
游标的开启及关闭,必须成对出现,语法:
open cursor_name;
close cursor_name;
定义一个游标的完整语法示例:
CREATE PROCEDURE curdemo(IN in_id varchar(32))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1 where id=in_id;
DECLARE cur2 CURSOR FOR SELECT id,data FROM test.t2 where id=in_id;
# 申明游标遍历结束的标记
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
# 打开游标
OPEN cur1;
OPEN cur2;
# 遍历游标
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;# 如果遍历结束,退出循环
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
# 关闭游标
CLOSE cur1;
CLOSE cur2;
END;
写在最后的踩坑点:
1.申明游标时,必须定义一个完整的SQL查询语句。
MySQL官网游标(cursor)说明