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

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

MySQL中,可以使用游标来传递参数。引用中的示例演示了如何创建一个存储过程test_cursor,其中包含一个in参数param和一个out参数result,并使用游标cur_test来查询users数据表中的记录。 首先,我们创建了一个名为test_cursor的存储过程,其中定义了参数param和result,并声明了一些局部变量。然后,我们创建了一个名为cur_test的游标,用于查询users数据表中的user_name和user_pass字段。 在游标的定义中,我们还声明了一个continue handler,用于在没有更多行可供读取时设置done变量为1。 接下来,我们使用if语句来判断是否有传入的参数param。如果有参数传入,则通过查询users数据表中的相应记录将结果赋给result变量。否则,我们打开游标cur_test,并使用repeat循环通过游标逐行获取name和pass的值,并将结果与之前的结果使用concat_ws函数连接在一起。 最后,我们关闭游标cur_test,并结束存储过程。 要调用存储过程并传递参数,可以使用CALL语句,如引用中所示。在调用过程后,可以通过查询变量@test来获取存储过程返回的结果。 所以,使用游标MySQL中传递参数的方法是创建一个存储过程,声明游标和参数,并在存储过程使用游标来处理数据。然后通过调用存储过程并传递参数来获取结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL(85)MySQL游标(Cursor)的定义及使用](https://blog.csdn.net/m0_54144956/article/details/131294159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值