mysql存储过程结果集循环遍历,变量赋值 判断 游标等基本操作
我们在使用存储过程的时候,会需要对指定结果集进行遍历修改或其他操作。这个时候就可以使用游标来进行操作了。
创建存储过程就不说了。游标的使用也不难。
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;