admin管理员组文章数量:1599541
存储过程中用到了游标,在定义变量是遇到了: 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 ;
整个过程如上面的代码所示
本文标签: variablemysqlconditionhandlerCursor
版权声明:本文标题:MySql error1337 Variable or condition declaration after cursor or handler declaration 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728325132a1154337.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论