MySql检索操作返回一组称为结果集的行。这组返回的行都是与sql语句相匹配的行(0行或多行)。用简单的select语句,例如,没有办法得到第一行,下一行或前10行。也不存在每次一行地处理所有的行简单办法(相对于成批的处理他们)。
目前游标只用于存储过程或函数里
一、声明游标
declare 游标名 cursor for 相应的select语句
二、打开和关闭游标
OPEN 游标名r;
CLOSE 游标名;
例1: create procedure proce_cursor_demo() BEGIN -- 声明变量 declare o int; -- 声明游标 declare cur_user CURSOR FOR select age from `user`; OPEN cur_user; FETCH cur_user INTO o; CLOSE cur_user; END
FETCH用来检索当前行的age列(将自动从第一行开始)赋值到一个名为o的局部声明的变量中。
declare语句的次序:1、局部变量 2、游标 3、句柄。 不遵守此顺序将产生错误。
例2:
create procedure proce_cursor_demo2() BEGIN -- 声明变量 declare done boolean default 0; declare i int; declare a int; -- 声明游标 declare cur_get_age_for_id CURSOR FOR SELECT id FROM `user`; -- 声明句柄 declare continue handler for SQLSTATE '02000' set done = 1; -- 创建用来保存id和age的表 create table if not exists u_age (uid int,age int); -- open the curson OPEN cur_get_age_for_id; -- 遍历所有行 REPEAT -- 得到id FETCH cur_get_age_for_id INTO i; -- 调用外部存储过程 得到age CALL proce_age_for_id(i,0,a); -- 插入到u_age表 insert into u_age(uid,age) VALUES (i,a); -- 结束遍历 UNTIL done END REPEAT; -- close the curson CLOSE cur_get_age_for_id; END; -- 执行函数 CALL proce_cursor_demo2();
理解:
REPEAT 是循环用的
结束条件是 UNTIL done END REPEAT; (done 是上面定义的布尔变量。为真时结束循环)
declare continue handler for SQLSTATE '02000' set done = 1;
这条名句定义了一个chontinue handler ,当SQLSTATE '02000'出现时,set done = 1就执行。(SQLSTATE '02000'是未找到条件,当数据遍历到末尾就出现)