mysql存储过程结果集循环遍历,变量赋值 判断 游标等基本操作

阅读980评论0

我们在使用存储过程的时候,会需要对指定结果集进行遍历修改或其他操作。这个时候就可以使用游标来进行操作了。

创建存储过程就不说了。游标的使用也不难。

declare 游标名称 CURSOR FOR SQL语句;
OPEN 游标名称;
	...逻辑语句
CLOSE 游标名称;



下面是一个完整的DEMO,涉及到了变量的声明和赋值,条件判断等。代码如下:

DELIMITER $$ 
CREATE PROCEDURE autoOrder(IN `_types` int(10))
BEGIN       
  declare done INT DEFAULT 0; -- 定义游标结束标识
  declare num int(10) DEFAULT 90000; -- 定义变量
  declare lastNo varchar(255) DEFAULT ''; -- 定义变量,存放最新编号
  declare _CursorV varchar(255) DEFAULT ''; -- 预定义游标的存储变量
  declare _Cursor CURSOR FOR SELECT orderNo FROM testTable where orderNo IS null and types =_types; -- 定义游标
  declare CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 用在循环前,如果游标到了最后就会将之前定义的done设置为1
  
  SELECT orderNo INTO lastNo FROM testTable ORDER BY orderNo DESC LIMIT 1; -- 查询数据库中最新的orderNo
  IF lastNo != '' THEN
	SET num= CONVERT(SUBSTRING(lastNo,-5),DECIMAL); -- 如果存在数据,截取后5位,并强制转换成数字类型
  END IF;
 
  OPEN _Cursor; -- 打开游标
  REPEAT -- REPEAT遍历结果集,当然你也可以使用while
	FETCH _Cursor INTO _CursorV; -- 将当前游标赋值给变量,如果不FETCH游标会进入死循环.....
	IF NOT done THEN 
	  /*这里是你的逻辑SQL*/
	  set num = num+1;
	  UPDATE testTable SET orderNo =concat('no', formType,'-',(num + 1)) WHERE orderNo IS null and types =_types LIMIT 1;
	END IF;
  UNTIL done END REPEAT; -- 结束遍历
  CLOSE _Cursor; -- 关闭游标
END$$
DELIMITER;