MYSQL中的嵌套游标,游标未按预期工作
我在MYSQL中创建了一个SP,通过传感器按日期获取值。My SP正确执行内部游标,但未执行外部游标(第一个游标)。i、 我只得到一天的数据,dateTable有一周的数据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
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本身上进行测试。