mysql 使用游标

缘起

因为数据库字段名字和意义被改变,里面已有数据,需要把数据修正,具体业务逻辑不再赘述,这里记录一般游标如何使用。代码意义都写在注释里面了。

-- 声明存储过程
DROP PROCEDURE IF EXISTS test1;
-- 定义 // 代替 ;  因为解释器遇到分号就会解释
-- 我们希望一个存储过程从头一直走到尾 所以用//代替;
delimiter //
CREATE PROCEDURE test1()

BEGIN
	-- 声明变量
	DECLARE classroomNo VARCHAR(32);
	DECLARE classroomName VARCHAR(50);
	DECLARE flag INT DEFAULT 0;
	-- 声明游标
	DECLARE classroomInfo CURSOR FOR 
	SELECT classroom_no,classroom_name FROM yop_classroom where classroom_name in 
	(SELECT classroom_no from yop_teaching_plan);
	-- 游标用loop循环取值  取完最后一个再循环的时候会报错
	-- 这里设置一个标志 遇到此错误退出循环
	DECLARE CONTINUE HANDLER FOR NOT FOUND set flag = 1;
	-- 打开游标
	OPEN classroomInfo;
	-- 获取结果
	ci:LOOP
		-- 给变量赋值 拉取游标中当前行的数据 赋值完 游标会自动指向下一行
		FETCH classroomInfo INTO classroomNo,classroomName;
		
		-- 如果flag = 1(意味着游标执行到最后一行),跳出循环
		IF flag = 1 THEN 
			LEAVE ci;
		END IF;
		
		-- 我的业务操作
		IF (classroomNo IS NOT NULL AND classroomName IS NOT NULL) THEN
			UPDATE yop_teaching_plan SET classroom_no = classroomNo WHERE classroom_no = classroomName;
		END IF;
		
	END LOOP;
	
	CLOSE classroomInfo;
END;
//
-- 把分号再替换回来
delimiter ;
-- 调用存储过程
CALL test1();

多说一句

分号替换一定要做,不然会在这一行报错

IF (classroomNo IS NOT NULL AND classroomName IS NOT NULL) THEN

报错信息:

> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 35
> 时间: 0.012s

提示好坑爹,对于我第一次写存储过程和游标来说,这个提示简直让我疯狂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值