mysql存储过程,如何循环取到多张表记录并合并输出

编写mysql存储过程,循环的查询到表结构相同的多张表记录并将结果表合并输出。可以查询多天也可查询单天

直接实例代码与注释

CREATE PROCEDURE tableData1(in sTime VARCHAR(255),in eTime VARCHAR(255)) 
BEGIN #创建传入两个参数的存储过程,sTime开始时间,eTime结束时间
		#定义变量
		DECLARE date VARCHAR(255);
		declare sqlVar varchar(21845);
		declare rest int;
		declare tableName varchar(1024);
		
		#给初始值 sqlVar为空字符串,因为下边要拼接sql语句
		set rest = 100;
		set sqlVar='';

#当开始时间等于结束时间时,只拼接一次sql语句-实现可以只查询一天数据
if sTime = eTime THEN
SET date = DATE_FORMAT(sTime,"%Y-%m-%d");
set sqlVar=CONCAT(sqlVar," (SELECT *
FROM data_detail_",sTime," WHERE XXX
 ");
 
 ELSE
		
#rest初始值是随便给的大于0的值。所以一定会进入循环。接下来在下边使用函数DATEDIFF用结束时间减去开始时间 
#给rest重新赋值,当大于0时说明还没结束继续拼接sql,当等于或小于零时说明应该结束了,不需要继续往下拼接sql
while rest > 0 do
 
 #转换日期格式,根据您自己的表结构来改,我是需要的
 SET date = DATE_FORMAT(sTime,"%Y-%m-%d");
		
 #使用开始时间拼接上字符串成为表名
 set tableName=CONCAT('data_detail_',sTime);
 
 #查询是否存在当前表名,赋值个数给cnt
 select count(1) from information_schema.tables where table_name = tableName into @cnt;

 #判断表名是否存在,当表不存在时直接跳过,不判断的话会报错
 if @cnt != 0 then

 #最最最重要的一点,当结束时间减去开始时间为1时,需要走else拼接上后边的的union all 。
 #当结束时间减去开始时间为1时,说明已经到达结束时间的前一天,并且在最后DATE_ADD将前一天日期加1已经到达结束时间。最后不需要再拼接上一个union all
		if rest=1 then
		 set sqlVar=CONCAT(sqlVar," (SELECT *
FROM data_detail_",sTime," WHERE XXX
)");
	ELSE
		 set sqlVar=CONCAT(sqlVar," (SELECT
FROM data_detail_",sTime," WHERE XXX
)",' UNION all');
	END IF;
 END if;

#判断到达某日期,当rest为1时说明已经到达结束日期前一天
set rest = DATEDIFF(eTime,sTime);
#当前日期加1
set sTime = DATE_FORMAT(DATE_ADD(sTime,INTERVAL 1 day),'%Y%m%d');

#结束循环与判断
END while;
END if;
	 
#赋值用户变量
set @v_s=sqlVar;
#预定义sql语句
prepare stmt from @v_s;
#执行预定义sql语句
EXECUTE stmt;
#释放资源
DEALLOCATE PREPARE stmt;
 
end;

call tableData1(‘20211006’,‘20211008’);
结果长这个样子
运行结果

1.创建存储过程语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
2.变量的定义与赋值:
局部变量
DECLARE variable_name datatype(size) DEFAULT default_value;
DECLARE相当于关键字,有点类似var,表示定义一个变量;然后variable_name是你指定的变量名称;datatype表示数据类型而括号内的size表示对应类型的格式比如varchar(50)这样子,这里需要注意的是datatype只能是MySql支持的那些基本数据类型;DEFAULT关键字指明了变量的默认值为default_value。
通过SET赋值: SET variable_name = XXX
用户变量
用户变量不需要声明,可以直接使用,用户变量以@var_name的形式命名变量,变量名必须以@开头
赋值语法; set @varName=value;

只说了我用到的两种变量,其他变量查阅其他资料哦

3.While循环语句结构:
while(表达式) do

end while;
与其他语言while循环大同小异了其实,不难理解当表达式结果为false时退出循环
4.if判断语句:
IF expression THEN
statements;
ELSE
else-statements;
END IF;
5.union与union all 的区别
对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jun_404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值