今日客户要求表内的数据依据某种分组生成HTML页面进行展示,一般处理这种需求直接上编程工具就好了,从数据库里读取数据,根据规则生成字符串,最后将字符串写出到文件。由于需求比较急,作为数据库编程系列文章,如果能用SQL实现首选还是SQL,这样处理既直接又快速,不过针对SQL要真的有耐心和信心写完,调试更是崩溃。由于要写出文件到硬盘,最后还是选择MySQL作为数据库工具,Navicat作为开发工具。

有两张表计划表、市县表,二者依靠市县编码(sxbm)进行等值连接,计划表内含有各个学校投放在各个市县的专业代号(zydh),专业名称(zymc)、招生备注(bz)、学制(xz)、要求的学历(xl)、计划数(jh)等字段组成的计划信息,院校编码(yxbm)为学校的两位数编码,院校代号(yxdh)为院校编码(yxbm)+市县编码(sxbm)组成的四位数编码,院校代号其实可以区分出学校在哪个市县的投档的专业计划。要求以学校为单位创建HTML页面,页面首先要以市县作为表格分割,然后根据专业代号排序。具体实现过程如下:

创建计划表:CREATE TABLE `zzjh2019v` (

`YXDH` varchar(9) COMMENT '学校代号',

`YXMC` varchar(54) COMMENT '学校名称',

`ZYDH` varchar(2) COMMENT '专业代号',

`ZYMC` varchar(28) COMMENT '专业名称',

`XZ` varchar(3) COMMENT '学制',

`XL` varchar(4) COMMENT '学历',

`JH` varchar(6) COMMENT '招生计划数',

`BZ` varchar(200) COMMENT '备注',

`yxbm` char(2) COMMENT '学校编码',

`sxbm` char(2) COMMENT '市县编码'

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;

创建市县编码表:CREATE TABLE `sx` (

`sxbm` char(2) COMMENT '市县编码',

`sxmc` varchar(20) COMMENT '市县名称'

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;

纠结了很久这个东西怎么写,最后采取游标、拼接字符串、字符串聚合,动态SQL,写文件等一些列操作完成需求,创建的存储过程如下:CREATE DEFINER=`root`@`localhost` PROCEDURE `splitjh`()

BEGIN

declare done INT DEFAULT 0;

declare pyxbm char(2);

declare psxmc varchar(10);

declare pyxmc varchar(50);

declare pjhall int;

declare pjhrows TEXT;

declare yxjh cursor

for

select yxbm,yxmc,sum(jh) jhall from zzjh2019v a,sx b where a.sxbm=b.sxbm group by yxbm,yxmc order by yxbm;

declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open yxjh;

fetch yxjh into pyxbm,pyxmc,pjhall;

while done !=1 do

select group_concat(jhrow separator '') into pjhrows from

(select concat('

',yxdh,'',yxmc,'在 ',b.sxmc,' 招生计划如下',sum(jh),'',group_concat('',zydh,'',zymc,'(',bz,')',jh,'',xz,'',xl,'' order by zydh separator '')) jhrow

from zzjh2019v a,sx b where yxbm=pyxbm and a.sxbm=b.sxbm group by yxdh order by yxdh,zydh) jhs;

set @pfilename = concat('''d:/32/1/1/jh11',pyxbm,'.html''');

set @sql =concat('select concat(''

3+2计划

代号 专业及名称备注 人数 学制 学历

prepare execsql from @sql;

execute execsql;

DEALLOCATE PREPARE execsql;

fetch yxjh into pyxbm,pyxmc,pjhall;

end while;

close yxjh;

END;

首先看效果,执行过程call splitjh();

在磁盘形成的HTML文件效果如下图(数据有一定的敏感性,进行了遮挡处理):

文件展示页面

生成的文件列表如下图:

生成的文件列表

这里一共有87所学校,所以生成了87的文件,添加CSS样式文件,让表格呈现如前图所示。

技术点

1)MySQL的游标,以及循环读取游标的方法,涉及的语句如下:declare yxjh cursor

for

select yxbm,yxmc,sum(jh) jhall from zzjh2019v a,sx b where a.sxbm=b.sxbm group by yxbm,yxmc order by yxbm;#游标定义

declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;#游标循环条件,注意此句一定要定义在游标之后,才起作用

open yxjh;#打开游标

fetch yxjh into pyxbm,pyxmc,pjhall;#将游标行内容赋值给变量。

2)执行动态SQL,由于MySQL into outfile 后接的文件名不能为变量,所以必须使用动态SQL的方法,涉及的语句如下:prepare execsql from @sql;#从一个变量准备一个动态sql,注意execsql不用提前定义

execute execsql;#执行准备好的语句

DEALLOCATE PREPARE execsql;#销毁语句

综上就是使用MySQL数据库,并借用MySQL写文件的方式将数据从数据库内按照需求导出文件,为何不用navicat导出呢?因为无法达到要求,又是聚合、又是格式,所以只能自己编写过程通过SQL语句拼接字符串的方式来实现。没有太多的技术难度,主要是想法和调试难度。后续在此基础上又开发了以市县为单位创建HTML文件,各招生学校作为分割的过程。本案例是实际需求催生出来的做法,在遇到这样的需求前你是先想到SQL还是先想到开发工具呢?从实际效果看使用SQL这种方式更加灵活。这样的SQL实现的字符串拼接是不是有点极限呢?

mysql 备份html数据_MySQL自动化生成HTML页面(导出数据)极限SQL编程-sql文件怎么打开...相关推荐

  1. mysql命令导入导出数据_mysql命令行导入和导出数据

    MySQL中导出CSV格式数据的SQL语句样本如下: select * from test_info into outfile '/tmp/test.csv' fields terminated by ...

  2. mysql 备份 第三方工具_Mysql第三方备份工具Xtrabackup使用说明

    1.Xtrabackup安装 1)yum安装方式: yuminstallhttp://www.percona.com/downloads/percona-release/redhat/0.1-3/pe ...

  3. mysql数据库实验任务二_MySQL数据库实验:任务二 表数据的插入、修改及删除

    任务二 表数据的插入.修改及删除 @[toc] 班级 姓名 软件工程16-9班 洪燕妮 [实训目的与要求] 1.利用MySQL命令行窗口进行增.删.改数据操作: 2.利用界面工具进行增.删.改数据操作 ...

  4. mysql 备份数据库原则_MySQL数据库备份方法说明

    MySQL数据库备份方法说明 更新时间:2007年07月29日 17:52:57   作者: 在数据库表丢失或损坏的情况下,备份你的数据库是很重要的.如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最 ...

  5. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  6. mysql日期纬度表_mysql中生成时间维度表

    mysql中生成时间维度表 利用mysql常用日期函数生成时间维度表,效率最高,最简单,无需其他的一些工具支持.生成结果示例如下图: # time span SET @d0 = "2012- ...

  7. mysql备份和优化_MySql Innodb存储引擎--备份和优化

    备份的目的 做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 测试:测试新功能是否可用 备份需要考虑的问题 可以容忍丢失多长时间的数据: 恢复数据要在多长时间内完 ...

  8. mysql备份恢复项目_mysql备份恢复之xtrabackup (XBK、Xbackup)

    10.1安装 10.1.1 安装依赖包: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo y ...

  9. mysql 备份命令行_mysql命令行备份方法

    一.mysql备份 1.备份命令 格式:mysqldump -h主机IP -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql # 本地备份可以不添加端口和主机IP ...

最新文章

  1. 将Byte数组转化为String
  2. CDays–4 习题六(修改文本)及相关内容解析。
  3. [BZOJ5249][九省联考2018]IIIDX(线段树)
  4. ubuntu 安装pytorch
  5. 【今晚七点】:对话快手张亮——聊聊音视频出海
  6. eas库存状态调整单不能反审核_审核与反审核
  7. 【转】WebApi中的C#await / async,重点是什么?
  8. Vue-watch选项
  9. SQL server常用查询
  10. MPLS CSPF工作原理详解和相关实验
  11. js计算两个时间相差月份
  12. 解决CentOS中无法使用setup命令 -bash:setup: command
  13. Pandas DataFrame 函数应用和映射
  14. 中级通信工程师证书有什么用
  15. 实时系统动态内存算法分析dsa(二)——TLSF代码分析
  16. 计算机不联网会有ip地址吗,不联网的电脑有ip地址吗
  17. U盘文件数据恢复工具如何使用
  18. Python绘制气泡图
  19. JavaScript简史
  20. python poisson图像融合制作CSDN博客头像

热门文章

  1. OptaPlanner –具有真实道路距离的车辆路线
  2. 在Java中获取素数的无限列表
  3. Java 8 Friday Goodies:轻松派本地缓存
  4. 使用LDAP保护Java EE6中的Web应用程序
  5. 使用Byteman和JUnit进行故障注入
  6. 使用NoSQL实施实体服务–第5部分:使用云提高自治性
  7. 解决阿里云 ssh 远程连接短时间没操作就会断掉的问题
  8. pbc是什么材料_职道漫谈 | 华为的绩效跟你们公司的绩效,有什么区别?
  9. python读取和存入json文件
  10. ajax.call失效无请求,移动端ajax请求问题?