游标cursor取值报错 Incorrect number of FETCH variables

参见写过的MySQL存储过程:MySQL存储过程删除历史数据_tabvla的博客-CSDN博客

在写存储过程对select进行分组,读取分组之后的column_1字段值时,报错Incorrect number of FETCH variables,存储过程如下:

BEGIN
	DECLARE done INT DEFAULT FALSE;
	DECLARE field_1 VARCHAR(256);
#定义游标	
	DECLARE cur CURSOR FOR (SELECT * from view2);
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
#采用视图
	DROP VIEW IF EXISTS view2;
#动态sql
	SET @strSql = "CREATE VIEW view2 as SELECT column_1, count(*) as col_count FROM table1 group by column_1";
	IF num IS NOT NULL THEN
		SET @strSql = CONCAT(@strSql, " HAVING col_count > ", num);
  END IF;
	PREPARE stmt FROM @strSql;  
  EXECUTE stmt;  
  DEALLOCATE PREPARE stmt; 
	
	OPEN cur;
	loop2 : LOOP
		FETCH cur INTO field_1;
		IF done THEN LEAVE loop2; 
		END IF;
		call p_test(field_1);
	END LOOP loop2;
	CLOSE cur;
END

问题出现在游标对应的select字段与fetch into不匹配,因为是按照column_1分组,取出数据量过万的数据值,查询sql如下:SELECT column_1, count(*) as col_count FROM table1 group by column_1 having col_count > 10000;包含两个字段column_1和col_count,尽管col_count不需要使用,依然需要创建field_2,写作FETCH cur INTO field_1, field_2; 问题解决

BEGIN
	DECLARE done INT DEFAULT FALSE;
	DECLARE field_1 VARCHAR(256);
	DECLARE field_2 INT(11);
#定义游标	
	DECLARE cur CURSOR FOR (SELECT * from view2);
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
#采用视图
	DROP VIEW IF EXISTS view2;
#动态sql
	SET @strSql = "CREATE VIEW view2 as SELECT column_1, count(*) as col_count FROM table1 group by column_1";
	IF num IS NOT NULL THEN
		SET @strSql = CONCAT(@strSql, " HAVING col_count > ", num);
  END IF;
	PREPARE stmt FROM @strSql;  
  EXECUTE stmt;  
  DEALLOCATE PREPARE stmt; 
	
	OPEN cur;
	loop2 : LOOP
		FETCH cur INTO field_1, field_2;
		IF done THEN LEAVE loop2; 
		END IF;
		call p_test(field_1);
	END LOOP loop2;
	CLOSE cur;
END

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值