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;




有 0 位网友评论: