相关文章推荐
乖乖的铁链  ·  事件 | 微信开放文档·  3 月前    · 
干练的创口贴  ·  宁晓艳_百度百科·  4 月前    · 
温文尔雅的韭菜  ·  javascript - How can ...·  1 年前    · 

在我们做统计的时候,尤其是复杂的数据统计,写sql是非常麻烦且痛苦的一件事情。尤其是表结构设计的不适合做统计的时候,更是难以下手。当做 统计的时候;需要牵扯到多张表且每个统计信息需要关联N张表才能出来结果的时候,大家可以用mysql的存储过程来进行业务处理。
前端时间做统计;业务场景是这样的:
首先判断当前时间是否为一月,若是一月,则取每个机构的去年和前年的每个月的收入统计;若不是一月,则取每个机构的今年和去年的每个月的收入统计。
存储过程进行for循环的业务逻辑呢大体是这样的:
通过定义变量(把值塞给变量,可以是数据库查到的,也可以是自定义),
定义游标(进行for循环,在for循环内进行读取数据,把读取的数据塞给变量,通过这些变量进行insert into 表,从而把得到的数据保存到临时表里。)
定义循环体判断变量,用来判断循环何时结束。

如下图:
1: DECLARE 是定义变量的语法。
2: DECLARE deptInfo CURSOR FOR select dept_id,dept_name from sys_dept where parent_id=‘100’ and del_flag=‘0’ and status=‘0’;
DECLARE deptInfo CURSOR FOR select dept_id,dept_name 意思是把查询的结果赋值给定义的游标deptInfo 。
在这里插入图片描述

2:对游标进行循环,在循环内进行业务处理
在这里插入图片描述

在这里插入图片描述
如上 就是存储过程进行for循环处理的流程。好了本次分享就到此结束。

DECLARE v_addtime_begin varchar(13); DECLARE v_addtime_end varchar(13); DECLARE v_borrow_id int; DECLARE v_count int; DECLARE s1 int; /** 声明游标,并将查询结果存到游标中 **/ DECLARE c_borrow CURSOR FOR SELECT ID from rocky_borrow WHERE BORROWTYPE = 2 AND PUBLISH_TIME >= UNIX_TIMESTAMP('2014-
MySQL 存储过程 中的3种 循环 , 存储过程 的基本语法,ORACLE与 MYSQL 存储过程 /函数的使用区别,退出 存储过程 方法 在 MySQL 存储过程 的语句中有三个标准的 循环 方式:WHILE 循环 ,LOOP 循环 以及REPEAT 循环 。还有一种非标准的 循环 方式:GOTO,不过这种 循环 方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了。 这几个 循环 语句的格式如下: WHILE……DO……E
首先,我们先认识下 MySQL 存储过程 这个概念。 MySQL 中每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由多个用分号(;)字符分割的语句组成的复合语句。 接着,我们来看看其语法格式: CREATE PROCEDURE PROCNAME(参数1 参数类型,参数2 参数类型,……) BEGIN --statement sql; 1:使用程序修正数量不一致的问题 2:使用 MySQL 存储过程 若使用第一种办法的话,需要重新发布版本,比较麻烦,再加上领导对发布版本有些抵触,我觉得我们还是使用第二种方式比较快捷。 1. 表结构 测试表结构如下: CREATE TABLE `member_album` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '数据I declare i int default 0; while i<100000 do insert into t2 values(i,'aaaaaaaaaaaaaaaaaaaa'); set i = i + 1; end whi... ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE condition; 其中,cursor_name 为游标的名称,SELECT column1, column2 FROM table_name WHERE condition 为查询语句。 2. 在 while 循环 中打开游标,并使用 FETCH 语句获取游标的值,如下所示: ```sql OPEN cursor_name; WHILE condition DO FETCH cursor_name INTO variable1, variable2; -- do something with the variables END WHILE; CLOSE cursor_name; 其中,condition 为 循环 条件,OPEN cursor_name 为打开游标,FETCH cursor_name INTO variable1, variable2 为获取游标的值并将其赋值给变量,CLOSE cursor_name 为关闭游标。 需要注意的是,在使用完游标后,应该使用 CLOSE 语句将其关闭,以防止内存泄漏。 qq_59834474: writeData(hssfWorkbook, sourceSheet, fatherMap, sonMap); setDataValid(hssfWorkbook, sheet, fatherMap, sonMap, "2", "source"); 这俩个方法没有 JAVA动态生成excel模板;列自定义下拉框赋值 博客小胡: 内置方法,获取文件路径 JAVA动态生成excel模板;列自定义下拉框赋值 qq_43203650: String downloadPath = Global.getDownloadPath() + filename;中Global.getDownloadPath()是什么意思啊 JAVA动态生成excel模板;列自定义下拉框赋值 博客小胡: * 生成主页面表头 * @param wb * @param mainSheet * @param headers private void initHeaders(HSSFWorkbook wb, HSSFSheet mainSheet, List<String> headers) { //表头样式 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 //字体样式 HSSFFont fontStyle = wb.createFont(); fontStyle.setFontName("微软雅黑"); fontStyle.setFontHeightInPoints((short) 12); style.setFont(fontStyle); //生成主内容 HSSFRow rowFirst = mainSheet.createRow(0);//第一个sheet的第一行为标题 mainSheet.createFreezePane(0, 1, 0, 1); //冻结第一行 //写标题 for (int i = 0; i < headers.size(); i++) { HSSFCell cell = rowFirst.createCell(i); //获取第一行的每个单元格 mainSheet.setColumnWidth(i, 4000); //设置每列的列宽 cell.setCellStyle(style); //加样式 cell.setCellValue(headers.get(i)); //往单元格里写数据