FETCH cursor_works INTO num,provinceIDs,cityIDs,SourceID;

定义的变量值必须与 游标中的字段不同,一一对应

DECLARE cursor_works CURSOR FOR SELECT worksSum,provinceID,cityID,SourceType FROM worksTemp;

CREATE  PROCEDURE  pro_province_report (IN startDate VARCHAR(20),IN endDate VARCHAR(20),IN SourceType INT)
/*
功能:根据时间,来源SourceType
统计 每个省份的 注册用户 投稿数 作品点击量 投票量 参与人数
pro_province_report();
*/ BEGIN DECLARE num INT DEFAULT 0;
DECLARE provinceIDs INT DEFAULT 0;
DECLARE cityIDs INT DEFAULT 0;
DECLARE SourceID INT DEFAULT 0; #用户注册 临时表
DROP TEMPORARY TABLE IF EXISTS memberUserTemp;
CREATE TEMPORARY TABLE memberUserTemp
SELECT COUNT(1) accountSum,provinceID,province,cityID,SourceType FROM MEMBERUSER WHERE provinceID>0 AND cityID>0 AND DATE(addDate)=DATE(now()) GROUP BY provinceID,cityID,SourceType; #投稿数 临时表
DROP TEMPORARY TABLE IF EXISTS worksTemp;
CREATE TEMPORARY TABLE worksTemp
SELECT COUNT(1) worksSum,provinceID,province,cityID,SourceType FROM WORKS WHERE provinceID>0 AND cityID>0 AND DATE(addDate)=DATE(now()) GROUP BY provinceID,cityID,SourceType; #用户注册信息
BEGIN DECLARE Done INT DEFAULT FALSE;
#声明游标
DECLARE cursor_memberUser CURSOR FOR SELECT accountSum,provinceID,cityID,SourceType FROM memberUserTemp WHERE cityID>0;
#将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = TRUE;
#打开游标
OPEN cursor_memberUser;
read_loop: LOOP
#逐个取出当前记录accountSum,provinceID,SourceType字段的值,
FETCH cursor_memberUser INTO num,provinceIDs,cityIDs,SourceID;
#遍历数据
IF Done THEN
LEAVE read_loop;
END IF;
#正常逻辑 判断 统计表中 当天 相同来源 相同省份 相同城市 是否存在数据,存在则更新,不存在则插入
SELECT COUNT(1) into @count FROM REPORT WHERE SourceType=SourceID AND ProvinceID=provinceIDs AND CityID=cityIDs AND DATE(addDate)=DATE(now());
IF (@count>0) THEN
UPDATE REPORT SET MemberNum=num WHERE SourceType=SourceID AND ProvinceID=provinceIDs AND CityID=cityIDs AND DATE(addDate)=DATE(now());
ELSE
INSERT INTO REPORT(SourceType,ProvinceID,CityID,MemberNum,WorkNum,PointNum,VoteNum,JoinPeopleNum,VotePeopleNum,addDate)VALUES(SourceID,provinceIDs,cityIDs,num,0,0,0,0,0,NOW());
END IF;
END LOOP;
#关闭游标
CLOSE cursor_memberUser;
END; #插入投稿数
BEGIN DECLARE Done2 INT DEFAULT FALSE;
#声明游标
DECLARE cursor_works CURSOR FOR SELECT worksSum,provinceID,cityID,SourceType FROM worksTemp;
#将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done2 = TRUE;
#打开游标
OPEN cursor_works;
read_loop: LOOP
#逐个取出当前记录accountSum,provinceID,SourceType字段的值,
FETCH cursor_works INTO num,provinceIDs,cityIDs,SourceID;
#遍历数据
IF Done2 THEN
LEAVE read_loop;
END IF;
#正常逻辑 判断 统计表中 当天 相同来源 相同省份 相同城市 是否存在数据,存在则更新,不存在则插入
SELECT COUNT(1) into @count FROM REPORT WHERE SourceType=SourceID AND ProvinceID=provinceIDs AND CityID=cityIDs AND DATE(addDate)=DATE(now());
IF (@count>0) THEN
UPDATE REPORT SET WorkNum=num WHERE SourceType=SourceID AND ProvinceID=provinceIDs AND CityID=cityIDs AND DATE(addDate)=DATE(now());
ELSE
INSERT INTO REPORT(SourceType,ProvinceID,CityID,MemberNum,WorkNum,PointNum,VoteNum,JoinPeopleNum,VotePeopleNum,addDate)VALUES(SourceID,provinceIDs,cityIDs,0,num,0,0,0,0,NOW());
END IF;
END LOOP;
#关闭游标
CLOSE cursor_works;
END; BEGIN
DECLARE sql_str VARCHAR(1000); #组合条件
DECLARE dateStr VARCHAR(200); #条件
DECLARE sourceStr VARCHAR(200); #来源条件 IF(startDate!=''&&endDate!='') THEN
SET dateStr=CONCAT( ' AND DATE(addDate)>=DATE("',startDate,'") AND DATE(addDate)<=DATE("',endDate,'")' );
ELSE
SET dateStr=" AND 1=1 ";
END IF; IF(SourceType>0) THEN
SET sourceStr=CONCAT(' AND SourceType="',SourceType,'" ');
ELSE
SET sourceStr=" AND 1=1 ";
END IF; SET sql_str =CONCAT(' SELECT p.province,tab.*
from( SELECT COUNT(1) counts, ProvinceID,SUM(MemberNum) MemberNum ,SUM(WorkNum) WorkNum,SUM(PointNum) PointNum,SUM(VoteNum) VoteNum,
SUM(JoinPeopleNum) JoinPeopleNum,SUM(VotePeopleNum) VotePeopleNum FROM REPORT where 1=1 ',dateStr,sourceStr,'
GROUP BY ProvinceID ) tab
INNER JOIN PROVINCE p ON tab.ProvinceID=p.id'); set @sql_str=sql_str; #将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @sql_str; #预处理需要执行的动态SQL,其中stmt是一个变量
EXECUTE stmt; #执行SQL语句
deallocate prepare stmt; #释放掉预处理段
END; END;

mysql 游标CURSOR的更多相关文章

  1. MySQL游标(cursor) 定义及使用

    概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果 ...

  2. mysql游标cursor与for循环

    delimiter // create procedure p2() begin declare row_id int DEFAULT 0; declare row_num int DEFAULT 0 ...

  3. SqlServer和MySQL游标学习

    一 sqlserver游标使用 /*** 游标的使用  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱.  使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...

  4. MySQL游标操作指南

    本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下   测试表 level  代码如下: create table test.level (name varchar(20)); ...

  5. MySQL游标的简单实践

    Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...

  6. mysql 游标 demo

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

  7. [转]MySQL游标的使用

    转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的S ...

  8. MYSQL 游标学习及使用实例

    who?(游标是什么?)游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果.每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言 ...

  9. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

随机推荐

  1. 使用nagios插件 check_mysql_health 过程中遇到的error

    使用nagios插件 check_mysql_health 过程中遇到的error 1.如果在运行监控mysql插件的时候遇到了error安装以下依赖包就可以解决: yum install perl- ...

  2. java代码实现鼠标双击出现画图-----------paint()方法由系统自动调用,且一定是小写的字母p

    总结:在运行过程中,自己不是很认真,没有检查自己写的代码,结果是无论你怎么运行,双击 frame都没用,因为系统根本就没有调用paint()方法绘图.所以很重要的是实现这个方法 package com ...

  3. MyBatis 工具 pndao - 自动写 SQL

    pndao的原理并不复杂,是基于MyBatis的方法命名约定来生成SQL,并且写入MyBatis需要的XML. 写之前会判断是否已经存在XML或者注解,如果已经存在则略过此方法,所以无论是注解还是XM ...

  4. 参数传递中编码问题(Get/Post 方式)(三)

    自己总结的:     GET方式:      1.提交方式为GET时,数据是放在请求HEADER头中的,且将数据与URL拼接后,浏览器会对拼接后的url进行编码,编码方式为浏览器默认的编码,      ...

  5. hadoop集群配置和在windows系统上运用java操作hdfs

    安装 配置 概念 hadoop常用shell命令 使用java操作hadoop 本文介绍hadoop集群配置和在windows系统上运用java操作hdfs 安装 http://mirror.bit. ...

  6. Shell编程的基本语法

    Shell编程 创建sh文件 touch test.sh vim test.sh 写入如下内容 #!/bin/bash a="hello" 运行 chmod +x /root/te ...

  7. 利用 Flask+Redis 维护 IP 代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

  8. 基于Halcon的一维条码识别技巧

    Bar Code 条形码 1.clear_all_bar_code_models    清除所有条形码模型释放内存clear_all_bar_code_models( : : : )2.clear_b ...

  9. java中的 equals 与 ==

    Java中的"=="永远比较的是两个对象是否是同一个对象(引用指向同一块内存就是同一个对象) Java中equals() 在使用必须与类挂上钩,不能单独使用.有的人这样理解&quo ...

  10. Python之面向过程和面向对象的区别

    一.面向过程 1.面向过程:核心是过程二字,过程指的是解决问题的步骤,好比如设计一条流水线,是一种机械式的思维方式. 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 .基本设计思路就是 ...