概述:游标只读取结果集数据,一行一行的读取,而且只能从头开始一行行往尾部读取,不能从中任意读取,而如果重新使用则从第一个开始。使用前必先定义,具体模板看代码。作用是遍历结果集。
以下例投票操作举例子:用户每创建(添加)一张投票表格(tno),将这张表单发送给每一个用户,即对应的table_belongto_user添加该tno,且默认为未投票,is_vote:0,这里的0是数据库的默认值设置与游标和存储过程无关。
table_belongto_user表结构:
结果:
建立过程:
存储过程IN 参数为tno.
存储过程建立头部分省略
BEGIN
DECLARE id int;
#游标创建过程
DECLARE no_more_record INT DEFAULT 0; //初始化游标的初始状态0
DECLARE curssor CURSOR FOR SELECT uid from `user`; //定义游标curssor,注意后面的select'语句为结果集,意味游标遍历该结果集
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1; //定义游标执行完的状态为1
OPEN curssor; //使用打开游标
FETCH curssor INTO id; //游标遍历一个数据
WHILE no_more_record != 1 DO
INSERT INTO table_belongto_user(tno,uid,is_vote) VALUES(tno,id,0);
FETCH curssor INTO id; //while循环中一个个遍历数据
END WHILE;
END
一、上述存储过程可以用for循环来理解;
DECLARE curssor CURSOR FOR SELECT uid from `user`;
相当于for循环的数组(result)。即,获取结果集(SELECT uid from `user`;)从而运用FETCH一条条遍历其数据(结果),来进行操作。
二、
DECLARE no_more_record INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1;
定义no_more_record=0; 意义为标志着游标未遍历完结果集,继续遍历
第二句的意思为若没有数据返回,程序继续,并将变量no_more_record设为1,即遍历完结果集。
三、
OPEN curssor; //使用打开游标
FETCH curssor INTO id;
open curssor相当于赋值于int i = 0;
FETCH curssor INTO id; 相当于 首先 curror = result[i] 再赋值给id , id = curssor;
执行完一句FETCH 游标会进入下一个结果,相当于i++;意思就是一个FETCH语句就是一个++;
四、
遇到的错误:ERROR 1337 (42000): Variable or condition declaration after cursor
错误原因:
所有的声明变量应该放到游标后。
按照指定顺序即可,如上。