游标
游标只能用于存储过程内, 且具有如下三个属性
- 敏感: 服务端可能会做其关联表结果的副本,也能不会做其关联表结果的副本.
- 只读: 游标的数据不可更改
- 不可回滚: 只能朝一个方向前进,不能跳跃前进,也不可以回退
游标声明
DECLARE cursor_name CURSOR FOR select_statement
- cursor_name 游标名称 同一个语句块内必须唯一
- select_statement 游标关联的查询语句或结果集 查询语句中不能使用into子句法. 另select取的列数应与fetch into对应的列数一致
游标的声明必须出现在条件处理声明之前, 变量和条件声明之前
打开游标
OPEN cursor_name
取游标数据
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
取游标关联的结果集中的下一行数据, 执行该语句时, 游标必须被打开. 如果下一行存在数据则数据值会被存在指定的变量中, 若下一行没有数据,则会触发SQLSTATE值为'02000'或NOT FOUND的条件处理.
- cursor_name 游标名
- var_name 存数据的变量名 数量应与select选择的列数一致
关闭游标
CLOSE cursor_name
此语句时关闭之前打开的游标, 如果游标没有被打开将会出错, 没哟显示关闭将会在所在BEGIN...END结束后关闭
示例
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
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;