游标概述:
MySQL支持在存储程序(存储过程、存储函数)里定义(一个/多个)游标,游标具有以下属性:
- 只读:不可更新
- 不可滚动:只可以沿着一个方向遍历,不能跳过某些行。
## 关于游标申明、打开、使用、关闭的全过程实例
CREATE DATABASE test;
USE test;
CREATE TABLE t1(
id char(16),
data int
);
CREATE TABLE t2(
i int not null);
CREATE TABLE t1(
id char(16),
data int
);
CREATE PROCEDURE cur_demo()
BEGIN
DECLARE done INT DEFAULT FALES;
DECLARE a CHAR(16);
DECLARE b, c INT;
# 申明游标
DECLARE cur1 CURSOR FOR SELECT id, data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
# 申明条件
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;
游标申明:
DECLARE cursor_name CURSOR FOR select_statement
#使用上面的语句,可以申明一个游标,并且使用seclect_statement语句将查询到结果存入到游标中。
#seclect_statement 语句中查询的列数必须与FETCH语句中输出变量的数量一致。
#seclect_statement 语句中不能包含INTO...
#游标申明必须出现在句柄(handler)申明之前,条件(condition)和变量(variable)之后
#一个存储程序可以包含多个游标,但是每个游标在给定的区域中名字必须唯一
游标打开:
OPEN cursor_name
# 使用这条语句可以打开已经申明好的游标
提取游标内数据:
将游标中的数据提取出来,存入到给定的变量中
FETCH [[NEXT] FROM]cursor_name INTO var_name1[, var_name2,... var_nameN
# 使用这条语句将已打开游标中的数据提到到给定的变量中,并将游标内指针往前移动
# 被检索的列数必须和申明时select语句中的列数一致
游标关闭:
CLOSE cursor_name
# 使用这条语句将之前打开的游标cursor_name 关闭
# 如果这个游标没有被打开,将会抛出一个错误
# 如果已打开的游标没有被显式的关闭,它将在定义其BEGIN....END 的语句块结束时被关闭