Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL中的嵌套游标,游标未按预期工作_Mysql - Fatal编程技术网

MYSQL中的嵌套游标,游标未按预期工作

MYSQL中的嵌套游标,游标未按预期工作,mysql,Mysql,我在MYSQL中创建了一个SP,通过传感器按日期获取值。My SP正确执行内部游标,但未执行外部游标(第一个游标)。i、 我只得到一天的数据,dateTable有一周的数据 CREATE PROCEDURE `Analysis`() BEGIN declare v_date datetime; declare v_sensor varchar(50); DECLARE datecursHandler,sensorCursHandler BOOLEAN DEFAULT FALSE; Block1

我在MYSQL中创建了一个SP,通过传感器按日期获取值。My SP正确执行内部游标,但未执行外部游标(第一个游标)。i、 我只得到一天的数据,dateTable有一周的数据

CREATE PROCEDURE `Analysis`()
BEGIN
declare v_date datetime;
declare v_sensor varchar(50);
DECLARE datecursHandler,sensorCursHandler BOOLEAN DEFAULT FALSE;

Block1: BEGIN 
declare datecursor CURSOR for 
select  distinct date from dateTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET datecursHandler = TRUE;

Open datecursor;
datecurs: loop

FETCH datecursor into date;
IF datecursHandler THEN
        CLOSE datecursor;
        LEAVE datecurs;
END IF;

        Block2: BEGIN 

        declare sensorCursor CURSOR for
        select distinct sensor from sensorTable ;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET sensorcur = TRUE;

        Open sensorCursor;
        senscurs: loop
        FETCH  sensorCursor into sensor;

        IF sensorcur THEN
                SET sensorcur = False;
                CLOSE sensorCursor;
                LEAVE senscurs;
                END IF;

        Insert into temptable(
        sensorValue,
        DateID,
        TimeID, 
        TotalCount,
        TotalDistinctCount
        )
        SELECT 
            sensor AS sensorValue,
            DATE_FORMAT(firstdate, '%Y%m%d') AS DateID,
            HOUR(firstdate) + 1 AS TimeID,
            COUNT(*) AS totalcount,
            COUNT(DISTINCT sensor) AS sensordistinctcount
        FROM
            (SELECT 
                    sensor AS sensor,
                    first_seen AS DeviceFirstSeen,
                    last_seen AS DeviceLastSeen,
                    DATE_FORMAT(FROM_UNIXTIME(first_seen), '%Y/%m/%d %k:%i:%s.%f') AS firstdate,
                    DATE_FORMAT(FROM_UNIXTIME(last_seen), '%Y/%m/%d %k:%i:%s.%f') AS lastdate,          
            FROM
                sensorTable
            INNER JOIN sensorTable2 ON sensorTable.ID = sensorTable2.ID
            WHERE sensorTable.DeviceFirstSeen BETWEEN date_format(date_sub(date,interval 1 day),'%Y-%m-%d 15:00:00') AND date_format(date,'%Y-%m-%d 14:59:59')) a
        GROUP BY DATE_FORMAT(firstdate, '%Y%m%d') , HOUR(firstdate) + 1;

        end loop Maccurs;


        END Block2;
END loop datecurs;
END Block1;
END
有人能帮我调试代码吗?我已经研究过了,但到目前为止,我的代码看起来和我的研究一样正确,但没有像预期的那样工作

所需输出:
获取从dateTable中选择的每天每小时所有传感器的计数。

请尝试以下步骤,因为问题可能是光标关闭不正确

CREATE PROCEDURE `Analysis`()
BEGIN
declare v_date datetime;
declare v_sensor varchar(50);
DECLARE datecursHandler,sensorCursHandler BOOLEAN DEFAULT FALSE;

Block1: BEGIN 
declare datecursor CURSOR for 
select  distinct date from dateTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET datecursHandler = TRUE;

select  distinct date from dateTable; #what is the result set you are getting?

Open datecursor;
datecurs: loop

FETCH datecursor into v_date;
IF datecursHandler THEN
        LEAVE datecurs;
END IF;

        Block2: BEGIN 

        declare sensorCursor CURSOR for
        select distinct sensor from sensorTable ;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET sensorCursHandler = TRUE;

        Open sensorCursor;
        senscurs: loop
        FETCH  sensorCursor into v_sensor;

          IF sensorCursHandler THEN
    SET sensorCursHandler  = false;
       LEAVE senscurs;
          END IF;

        Insert into temptable(
        sensorValue,
        DateID,
        TimeID, 
        TotalCount,
        TotalDistinctCount
        )
        SELECT 
            sensor AS sensorValue,
            DATE_FORMAT(firstdate, '%Y%m%d') AS DateID,
            HOUR(firstdate) + 1 AS TimeID,
            COUNT(*) AS totalcount,
            COUNT(DISTINCT sensor) AS sensordistinctcount
        FROM
            (SELECT 
                    sensor AS sensor,
                    first_seen AS DeviceFirstSeen,
                    last_seen AS DeviceLastSeen,
                    DATE_FORMAT(FROM_UNIXTIME(first_seen), '%Y/%m/%d %k:%i:%s.%f') AS firstdate,
                    DATE_FORMAT(FROM_UNIXTIME(last_seen), '%Y/%m/%d %k:%i:%s.%f') AS lastdate,          
            FROM
                sensorTable
            INNER JOIN sensorTable2 ON sensorTable.ID = sensorTable2.ID
            WHERE sensorTable.DeviceFirstSeen BETWEEN date_format(date_sub(date,interval 1 day),'%Y-%m-%d 15:00:00') AND date_format(date,'%Y-%m-%d 14:59:59')) a
        GROUP BY DATE_FORMAT(firstdate, '%Y%m%d') , HOUR(firstdate) + 1;

        end loop senscurs;
        close sensorCursor;
        END Block2;

END loop datecurs;
close datecursor;
END Block1;
END

恕我直言,“没有按预期工作”并不能很好地描述您的问题。你期望它做什么?它的作用是什么?它是否返回错误?如果是,确切的错误消息是什么?我在If datecursHandler中看到一个输入错误。LEAVE datecurs应该是LEAVE datecursor,对吗?@Martijnvisers不,LEAVE datecurs是要退出的循环的名称。好的,我的bad@success-maharjan在block2中添加continue处理程序,如果没有记录,也添加if leave循环。我用block2处理程序更新了代码,并使用了不同的变量名。对于A和B传感器,我得到的奇怪结果仅为1天1小时和2小时。抱歉,请忽略我对奇怪结果集的最后评论,这是我的数据问题。我如何让它运行多天?我仍然只获取了一天的数据。我使用了你提供的脚本。block 2循环可以循环到A和B传感器,但block 1循环的日期不起作用。您收到的不同日期输出是什么?我的日期表中有7个日期,我在选择不同日期时获得所有日期。通过将查询也放在SP本身上进行测试。