-- 一个奇怪的My SQL游标循环问题 --

luoyoumou luoyoumou 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
-- 我的一个函数
-- 其作用是生成一个可执行的SQL语句,
-- 目的是生成“查询一张表的int类型字段的所有max、min、avg值”的SQL语句的函数:

DELIMITER $$

CREATE FUNCTION get_tb_numberInfo(v_tb_name varchar(50))
RETURNS VARCHAR(2000) CHARSET utf8
BEGIN
DECLARE v_sql varchar(20000);

DECLARE v_column_name varchar(200);
DECLARE v_column_name_min varchar(200);
DECLARE v_column_name_max varchar(200);
DECLARE v_column_name_avg varchar(200);
DECLARE no_more_departments boolean;

DECLARE get_tbInfo CURSOR FOR
SELECT column_name FROM information_schema.columns
WHERE UPPER(TABLE_NAME)=upper(v_tb_name)
AND TABLE_SCHEMA=(select database())
AND DATA_TYPE IN('bigint','int','decimal');

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;
SET no_more_departments=0;
SET v_sql := 'SELECT ';
OPEN get_tbInfo;
REPEAT
-- Get get_tbInfo
FETCH get_tbInfo INTO v_column_name;
SET v_column_name_min = concat('min(',v_column_name,') as ',v_column_name,'_min,');
SET v_column_name_max = concat('max(',v_column_name,') as ',v_column_name,'_max,');
SET v_column_name_avg = concat('avg(',v_column_name,') as ',v_column_name,'_avg,');
SET v_sql = concat(v_sql,v_column_name_min,v_column_name_max,v_column_name_avg,'\n');
UNTIL no_more_departments
END REPEAT;
CLOSE get_tbInfo;

SET v_sql = substring(v_sql,1,length(v_sql)-1);
SET v_sql = concat(v_sql,' from ',v_tb_name,';');

RETURN v_sql;
END;
$$

delimiter ;

-- 但是:我每次执行后,最后一个字段生成了两次:min、max、avg字段,例如:
mysql> select get_tb_numberInfo('f_union_refer_date_index');

SELECT
min(date_id) as date_id_min,max(date_id) as date_id_max,avg(date_id) as date_id_avg,
min(refer_id) as refer_id_min,max(refer_id) as refer_id_max,avg(refer_id) as refer_id_avg,
min(ip_num) as ip_num_min,max(ip_num) as ip_num_max,avg(ip_num) as ip_num_avg,
min(direct_pv_num) as direct_pv_num_min,max(direct_pv_num) as direct_pv_num_max,avg(direct_pv_num) as direct_pv_num_avg,
min(indirect_pv_num) as indirect_pv_num_min,max(indirect_pv_num) as indirect_pv_num_max,avg(indirect_pv_num) as indirect_pv_num_avg,
min(direct_cv_num) as direct_cv_num_min,max(direct_cv_num) as direct_cv_num_max,avg(direct_cv_num) as direct_cv_num_avg,
min(indirect_cv_num) as indirect_cv_num_min,max(indirect_cv_num) as indirect_cv_num_max,avg(indirect_cv_num) as indirect_cv_num_avg,
min(direct_uv_num) as direct_uv_num_min,max(direct_uv_num) as direct_uv_num_max,avg(direct_uv_num) as direct_uv_num_avg,
min(new_uv_num) as new_uv_num_min,max(new_uv_num) as new_uv_num_max,avg(new_uv_num) as new_uv_num_avg,
min(new_uv_num) as new_uv_num_min,max(new_uv_num) as new_uv_num_max,avg(new_uv_num) as new_uv_num_avg from f_union_refer_date_index;

-- 请问是怎么回事儿呢?有什么办法解决不?

...全文

相关推荐

评论 12
收藏 已收藏
分享
返回顶部
luoyoumou
MySQL 57,062 成员 56,759 内容