MySQL存储过程---动态的表名
drop procedure if exists pr_multi; create PROCEDURE pr_multi()
begin
declare areanum varchar(32); -- 区域编码
DECLARE v_tablename varchar(50);
DECLARE v_sysbn INT;
DECLARE v_monthbn INT;
DECLARE v_bnrate VARCHAR(32);
DECLARE v_zzounum INT;
DECLARE v_pubouzznum INT;
DECLARE v_totalpubnum INT;
DECLARE v_monpubnum INT;
DECLARE v_zzrate VARCHAR(32);
DECLARE v_ounum INT;
DECLARE outasknum INT;
DECLARE v_outasknum INT;
DECLARE done INT DEFAULT FALSE; -- 遍历数据结束标志
DECLARE myCursor CURSOR FOR( -- 定义游标并输入结果集select SUBSTR(oucode,1,6) as area from frame_ou GROUP BY area having LENGTH(area)>0 limit 10);
-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制变量到游标,游标循环结束自动转true
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable (rowguid VARCHAR(50) PRIMARY KEY,areaname VARCHAR(50),sysbn INT,monthbn INT, bnrate VARCHAR(50),zzounum int, pubouzznum INT, totalpubnum INT, monpubnum INT, zzrate VARCHAR(50) );TRUNCATE TABLE tmpTable; OPEN myCursor; -- 打开游标 myLoop: LOOP -- 开始循环体,myLoop为自定义循环名FETCH myCursor into areanum; -- 将游标当前读取行的数据,顺序赋予自定义变量 IF done=1 THEN -- 判断是否继续循环 LEAVE myLoop; -- 结束循环 END IF;set v_tablename=CONCAT('audit_project_',areanum);set @preparable_stmt1=CONCAT("select COUNT(1) FROM ",v_tablename,' into @v_sysbn;');set @preparable_stmt2=CONCAT("select COUNT(1) FROM ",v_tablename,' where date_format(applydate,\'%Y-%M\')=date_format(now(),\'%Y-%M\') into @v_monthbn;');set @preparable_stmt3=CONCAT("select count(1) from ( select ouguid from ",v_tablename,' group by ouguid) c into @ounum;');select count(1) into v_ounum from frame_ou where oucode like CONCAT('%',areanum,'%');select count(1) into v_zzounum from (select count(*) from zhengzhaotopten where oucode like CONCAT('%',areanum,'%') and zznum>0 GROUP BY oucode) c;select count(1) into v_pubouzznum from(select oucode from mongdb_zztj GROUP BY oucode) c where c.oucode like CONCAT('%',areanum,'%');select sum(entryNum) INTO v_totalpubnum from mongdb_zztj where oucode like CONCAT('%',areanum,'%');select sum(entryNum) INTO v_monpubnum from mongdb_zztj where oucode like CONCAT('%',areanum,'%') and DATE_FORMAT(EntryDate,'%Y-%M')=DATE_FORMAT(NOW(),'%Y-%M');select count(1) from (select count(1) from audit_task where areacode=areanum and LENGTH(ouname)>0 GROUP BY ouguid) c into @outasknum;select count(1) from (select oucode from mongdb_zztj where LENGTH(oucode)>0 and oucode like CONCAT('%',areanum,'%') GROUP BY oucode) c into @v_outasknum;prepare stmt1 from @preparable_stmt1; prepare stmt2 from @preparable_stmt2; prepare stmt3 from @preparable_stmt3; EXECUTE stmt1; EXECUTE stmt2;EXECUTE stmt3; set v_sysbn=@v_sysbn;set v_monthbn=@v_monthbn;set v_bnrate=CONCAT(TRUNCATE((@ounum/v_ounum)*100,1),'%');set v_zzrate=CONCAT(TRUNCATE((@v_outasknum*1.0)/(@outasknum*1.0)*100,1),'%');INSERT INTO tmpTable(rowguid,areaname,sysbn,monthbn,bnrate,zzounum,pubouzznum,totalpubnum,monpubnum,zzrate) values(UUID(),areanum,v_sysbn,v_monthbn,v_bnrate,v_zzounum,v_pubouzznum,v_totalpubnum,v_monpubnum,v_zzrate);END LOOP myLoop; -- 结束自定义循环体 CLOSE myCursor; -- 关闭游标 select * from tmpTable;
end; call pr_multi;
目标:当我们使用触发器的时候,如果我们数据库里面采用的是分表的形式,就是我们信息存在project_aaaa,project_bbbb,project_cccc,project_dddd,里面的数据表结构都是一样的,那么我们肯定是想如果能够在存储结构中能够根据表的后缀的不同,实现对不同的表的遍历,于是我们就不得不去想着在存储结构中使用的是动态的表明。
于是我们在上面遍历的其实是后缀,不断的改变表的后缀实现在不同的表中进行数据的遍历。
set v_tablename=CONCAT('audit_project_',areanum);
这个可以认为是我们不断的改变表的名称,设置预处理字符串:
set @preparable_stmt1=CONCAT("select COUNT(1) FROM ",v_tablename,' into @v_sysbn;');
prepare stmt1 from @preparable_stmt1;
EXECUTE stmt1;
上面 这几个语句可以说是我们使用动态的表名的核心的部分
希望上面的对你有所帮助
MySQL存储过程---动态的表名相关推荐
- mysql 存储过程 动态建表_MySQL存储过程动态创建表,数据分表
BEGIN DECLARE `@i` int(11); DECLARE `@siteCount` int(11); DECLARE `@sqlstr` VARCHAR(2560); DECLARE ` ...
- Mysql预编译动态拼接表名查询
1.实现目标,现在对deal_runnning表进行按年月分表,需要动态拼接表名查询 2.需要执行此sql .表名要动态拼接,目标sql如下,使用concat连接表名无效. SELECT id, ba ...
- mysql 动态 建表,mysql数据库动态创建表的实例分享
摘要 腾兴网为您分享:mysql数据库动态创建表的实例分享,易视云3,完美root,刷机大师,手游宝等软件知识,以及清仓兔,找明星,爱普生1500w,txt完结小说全本软件,windows自带画图软件 ...
- mysql 变量作表名查询_使用MySQL函数变量作为表名查询
我需要有一个表中增加一定的ID(如AUTO_INCREMENT)函数使用MySQL函数变量作为表名查询 我有水木清华这样 DELIMITER $$ DROP FUNCTION IF EXISTS `G ...
- 【MyBatis】myBatis动态传入表名进行查询
由于分表就涉及到了有相近查询语句只是表名不同的情况,刚开始使用了 <select id="selectById" resultMap="BaseResultMap& ...
- MyBatis构建sql时动态传入表名以及字段名
http://wendy-wxie.iteye.com/blog/1605193 用了mybatis很长一段时间了,但是感觉用的都是比较基本的功能,很多mybatis相对ibatis的新功能都没怎么用 ...
- MyBatis,动态传入表名,字段名的解决办法
http://luoyu-ds.iteye.com/blog/1517607 今天做项目,遇到的问题就是需求修改数据表的记录,而且字段名都不是固定的,也就是说是需要通过参数传入的, 本来这也不是什么难 ...
- mybatis获取表名_mybatis动态调用表名和字段名
一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...
- mysql 设置 table name 表名不区分大小写
前言 mysql 5.7.31 Linux下的MYSQL默认是区分表名大小写:Windows下表名不区分大小写. 查看 table name 是否区分大小写 mysql> show variab ...
最新文章
- [老老实实学WCF] 第二篇 配置WCF
- 如何保证 Serverless 业务部署更新的一致性?
- java多线程系列13 设计模式 Future 模式
- [摘译]js内存泄漏常见的四种情况
- 小学计算机flash,小学信息技术flash课件
- STM32的内存扩展应用实现,小内存的单片机也能干大事(FSMC+SRAM)
- 什么是图形加速卡(二)
- 硬盘是计算机的 奥鹏,奥鹏2016计算机应用基础一
- 【delphi】开发微信小程序后台控件(一)(含源代码、演示程序、控件使用帮助)
- 51单片机数码管滚动显示学号_单片机数码管显示0到9程序代码
- Java项目:ssh实验室预约管理系统
- 这十一条程序员必备软技能,你一定要知道
- 【jzoj1965】【递推】【普组模拟赛】马球比赛
- Java数据结构学习——排序二叉树
- 查询用户上次登录时间问题
- 2022最新云存储网盘系统/文件分享存储系统
- 2021广西梧州高考成绩查询,完整记录!梧州各中学2019年高考成绩数据出炉!还有这个谣言别乱传!...
- LED:视展VSD控制卡网口闪烁不能访问
- PicGo + 阿里云图床上传失败解析
- 常用的网络安全防范技术有哪些?如何提高网络安全防护意识?