在我们做统计的时候,尤其是复杂的数据统计,写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:
JAVA动态生成excel模板;列自定义下拉框赋值
博客小胡:
JAVA动态生成excel模板;列自定义下拉框赋值
qq_43203650:
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)); //往单元格里写数据