参见写过的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