mysql 存储过程中使用了游标和临时表,返回的临时表数据不准确

问题描述

mysql 存储过程中使用了游标和临时表,返回的临时表数据不准确

DELIMITER $$

USE laolao$$

DROP PROCEDURE IF EXISTS parent_sport_sort1$$

CREATE DEFINER=root@% PROCEDURE parent_sport_sort1(IN jidb VARCHAR(64),IN uname VARCHAR(64),IN starttime VARCHAR(64),IN endtime VARCHAR(64),
IN startmonth VARCHAR(64),IN endmonth VARCHAR(64),IN startday VARCHAR(64),
OUT totala INT,OUT ranking INT,OUT totalamonth INT,OUT rankmonth INT,OUT totaladay INT,OUT rankday INT,OUT usname VARCHAR(64))
BEGIN
DECLARE usname VARCHAR(64);

DECLARE done INT DEFAULT FALSE;                

创建游标
DECLARE cur_usname CURSOR FOR SELECT parentname FROM user_chilld  WHERE childname=uname;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

创建临时表
 CREATE TEMPORARY TABLE IF NOT EXISTS tmp_sportdata(
    totala INT(11),
    ranking INT(11),
    totalamonth INT(11),
    rankmonth INT(11),
    totaladay INT(11),
    rankday INT(11),
    usname VARCHAR(64)
);

OPEN cur_usname;

read_loop: LOOP

FETCH cur_usname INTO usname;

IF done THEN
    LEAVE read_loop;
END IF;
 SET @mytemp = 0;
 SELECT newid,stotal,usname INTO ranking,totala,usname FROM(
    SELECT (@mytemp:=@mytemp+1) AS newid,stotal,username FROM (
        SELECT  SUM(total) stotal, username FROM exercise
            WHERE ( username
                IN(
                    SELECT username FROM ofRoster
                        WHERE jid=CONCAT(usname,jidb)
                        OR username =usname)
             AND createtime BETWEEN starttime AND endtime
             )GROUP BY username ORDER BY stotal DESC
        )a
    ) a1  WHERE username=usname;

SET @mytemp = 0;
SELECT newid,stotal INTO rankmonth,totalamonth FROM(
    SELECT (@mytemp:=@mytemp+1) AS newid,stotal,username FROM (
        SELECT  SUM(total) stotal, username FROM exercise
            WHERE ( username
                IN(
                    SELECT username FROM ofRoster
                        WHERE jid=CONCAT(usname,jidb)
                        OR username =usname)
             AND createtime BETWEEN startmonth AND endmonth
             )GROUP BY username ORDER BY stotal DESC
        )a
    ) a1  WHERE username=usname;

SET @mytemp = 0;
SELECT newid,stotal INTO rankday,totaladay FROM(
    SELECT (@mytemp:=@mytemp+1) AS newid,stotal,username FROM (
        SELECT  SUM(total) stotal, username FROM exercise
            WHERE ( username
                IN(
                    SELECT username FROM ofRoster
                        WHERE jid=CONCAT(usname,jidb)
                        OR username =usname)
             AND createtime BETWEEN startday AND startday
             )GROUP BY username ORDER BY stotal DESC
        )a
    ) a1  WHERE username=usname;

    INSERT INTO tmp_sportdata VALUES(totala,ranking,totalamonth,rankmonth,totaladay,rankday,usname);

    END LOOP;

    CLOSE cur_usname;

    SELECT * FROM tmp_sportdata;

    DROP TABLE IF EXISTS tmp_sportdata;
END$$

DELIMITER ;

需求是这样的
一个儿女账号,绑定多个老人账号,然后一个儿女要查出绑定所有老人的每月的运动数据,每天的运动数据,当天的运动数据。其中运动数据中包括老人在好友中的排名,和运动步数

现在上面的存储过程基本上已经完成了这个功能,但是出现了bug,就是如果儿女绑定了两个老人,其中一个老人在今天没数据,另一个老人有数据的话,这个存储过程执行之后返回只有1条数据,如果两个老人在今天都有数据,就显示正常

时间: 2024-08-29 14:47:06

mysql 存储过程中使用了游标和临时表,返回的临时表数据不准确的相关文章

mysql 存储过程中游标临时表问题

问题描述 mysql 存储过程中游标临时表问题 DELIMITER $$ USE laolao$$ DROP PROCEDURE IF EXISTS parent_sport_sort1$$ CREATE DEFINER=root@% PROCEDURE parent_sport_sort1(IN jidb VARCHAR(64),IN uname VARCHAR(64),IN starttime VARCHAR(64),IN endtime VARCHAR(64), IN startmonth

mysql 存储过程中游标与多游标实例

例  代码如下 复制代码 DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day datetime) -- -- 实例 -- MYSQL存储过程名为:getUserInfo -- 参数为:date_day日期格式:2008-03-08 --     BEGIN declare _userName varchar(12); -- 用户名 declare _chines

mysql存储过程中变量的定义赋值操作

昨天我们讲了mysql教程存储过程创建修改与删除,下面我们这篇教程是讲关于mysql存储过程中变量的定义赋值操作哦. 一.变量的定义 定义一个变量语法如下: declare var_name[,...] type[default value] 看一个变量定义实例 declare last date; 二.mysql存储过程变量赋值 变量的赋值可直接赋值与查询赋值来操作,直接赋值可以用set来操作,可以是常量或表达式如果下 set var_name= [,var_name expr]... 给上面

mysql存储过程中动态表名的使用

问题描述 mysql存储过程中动态表名的使用 BEGIN if tablename is not null then declare v_sql varchar(500); set v_sql = concat('select WXPayBillID,WXPayMoney FROM ',tablename); select v_sql; set @v_sql=v_sql;///这里写的有问题? prepare stmt from @v_sql; EXECUTE stmt; deallocate

MySQL存储过程中实现执行动态SQL语句的方法_Mysql

本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法.分享给大家供大家参考.具体实现方法如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE set_col_value -> (in_table VARCHAR(128), -> in_column VARCHAR(128), -> in_new_value VARCHAR(1000), -> in_where VARCHAR(4

MySQL存储过程中的事务管理实例说明

mysql存储过程中事务SQL代码  delimiter $$  use test$$  create procedure t_insert_table()  begin      /** 标记是否出错 */      declare t_error int default 0;      /** 如果出现sql异常,则将t_error设置为1后继续执行后面的操作 */      declare continue handler for sqlexception set t_error=1; -

浅谈MySQL存储过程中declare和set定义变量的区别_Mysql

在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅在类中生效.即只在存储过程中的begin和end之间生效. 2.@set定义的变量,叫做会话变量,也叫用户定义变量,在整个会话中都起作用(比如某个应用的一个连接过程中),即这个变量可以在被调用的存储过程或者代码之间共享数据.如何理解呢?可以看下面这个简单例子,很好理解.  (1)先执行下面脚本,创建

mysql存储过程中使用游标的实例_Mysql

复制代码 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS getUserInfo $$ CREATE PROCEDURE getUserInfo(in date_day datetime)-- -- 实例-- MYSQL存储过程名为:getUserInfo-- 参数为:date_day日期格式:2008-03-08--    BEGINdeclare _userName varchar(12); -- 用户名declare _chinese int ; -

mysql存储过程中的异常处理

定义异常捕获类型及处理方法:     DECLARE handler_action HANDLER          FOR condition_value [, condition_value] ...          statement            handler_action:          CONTINUE        | EXIT        | UNDO            condition_value:          mysql_error_code