MySql error1337 Variable or condition declaration after cursor or handler declaration

博客围绕MySQL出现的Error 1337展开,虽未给出具体代码内容,但表明整个过程已在代码中呈现,聚焦于MySQL该错误相关情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程中用到了游标,在定义变量是遇到了:
ERROR 1337: Variable or condition declaration after cursor

这里是要先声明变量,再开始游标。
游标(cursor)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明。
如字面意思所说,先声明变量,再声明游标。

代码如下:

DROP FUNCTION IF EXISTS `to_pinyin`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCommission`(IN `member_id` INT(11), OUT `result` INT(1))
BEGIN
-- 1.定义变量
DECLARE result_code INTEGER DEFAULT 1; #定义返回结果并赋初值0
DECLARE s int DEFAULT 0;
DECLARE memberId int(11) DEFAULT 0;
DECLARE commission float(10,2) DEFAULT 0;
DECLARE total float(10,2) DEFAULT 0;
-- 2.定义游标,并将sql结果集赋值到游标中
DECLARE report CURSOR FOR (
	SELECT O.*
	FROM `orders` AS O 
);
-- 3.定义HANDLER
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result_code=0; #在执行过程中出任何异常设置result_code为0
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;	#声明当游标遍历完后将标志变量置成某个值
-- 打开游标
open report;
	-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
	fetch report into commission,memberId;
	-- 当s不等于1,也就是未遍历完时,会一直循环
	while s<>1 do
		-- 执行业务逻辑
		IF commission>0 THEN
			SET total = total + commission;
		END IF;
		-- 将游标中的值再赋值给变量,供下次循环使用
		fetch report into commission,memberId;
	-- 当s等于1时表明遍历以完成,退出循环
	end while;
-- 关闭游标
close report;

#开始事务
START TRANSACTION; 
UPDATE `members` SET `commission` = total WHERE `id` = member_id;
IF result_code=0 THEN
	#捕捉到错误,回滚
	ROLLBACK;
ELSE
	COMMIT;
END IF;
SET result = result_code;
END
;;
DELIMITER ;

整个过程如上面的代码所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值