MYSQL__MYSQL在存储过程中使用游标CURSOR
背景
在Mysql中使用存储过程。由于循环的过程中需要使用到字符,按照一些字符来循环,没有找到好的办法来循环字符。
所以考虑了游标来循环。
游标的好处是可以选择多个条件来循环,不限制字符还是或者没有顺序的东西。
实现
CREATE PROCEDURE CALSOMETHING(IN ROUND_CNT INT)
BEGIN DECLARE I INT;DECLARE pin_value varchar(20); DECLARE pin_cur CURSOR for select pin from prnodes; /*这个表里面记录着需要循环的数据,不连续,为字符*/ DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET PIN_VALUE = NULL;/*此处用于如果游标取值为空的时候就将pin_value置为NULL,防止错误*/ SET i= 1; while i <= ROUND_CNT DO open pin_cur; FETCH pin_cur into pin_value; while (pin_value is not null) DO /*此处做是否能取到值的判断。不能则结束循环*/ insert into PageRank SELECT pin_value FROM DUAL;FETCH pin_cur into pin_value; end while; close pin_cur; set i=i+1; commit; end while; end;
备注
1.DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET PIN_VALUE = NULL;
与
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FINISHED = 1;这种语法是一致的。
即:SQLSTATE '02000' = NOT FOUND
过程执行中用此处的条件来进行判断是否取值结束。
2.SQLSTATE为代码执行的状态:
02000 发生下述异常之一:
SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。
在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。
在 FETCH 语句中引用的游标位置处于结果表最后一行之后。