MySQL 获取不返回值

MySQL Fetch Not Returning Values

我第一次尝试使用 MySQL 游标,但碰壁了。下面的代码片段 应该 返回 tStart 和 tEnd 的实际(非午夜)时间值,但我得到的只是“00:00:00”。 table 中的 StartTime 和 EndTime 字段是 TIME 类型。 运行 只是 select 声明了 returns 的期望值。 Num_rows 表示返回 1 行,这也是预期的。谁能帮我解决我做错的事?

DECLARE tStart TIME;
DECLARE tEnd TIME;
DECLARE num_rows INT DEFAULT 0;

DECLARE curs_1 CURSOR FOR SELECT MIN(asd.StartTime), MAX(asd.EndTime) FROM database.table1 asd WHERE (((asd.varid)='1006') AND ((asd.neededdate)='2016-06-22') AND ((asd.neededint)=3));

OPEN curs_1;
SELECT FOUND_ROWS() INTO num_rows;
FETCH curs_1 INTO tStart, tEnd;

以下代码可以生成测试数据:

CREATE TABLE `table1` (`StartTime` TIME DEFAULT NULL,`EndTime` TIME DEFAULT NULL, `varid` VARCHAR(10) DEFAULT NULL, `neededdate` DATE DEFAULT NULL, `neededint` INT(11) DEFAULT NULL) ENGINE=INNODB;

INSERT INTO `table1` (`StartTime`,`EndTime`,`varid`,`neededdate`,`neededint`) VALUES ('09:00:00','18:00:00','1006','2016-06-22',3);
INSERT INTO `table1` (`StartTime`,`EndTime`,`varid`,`neededdate`,`neededint`) VALUES ('09:00:00','18:00:00','1007','2016-06-21',3);
INSERT INTO `table1` (`StartTime`,`EndTime`,`varid`,`neededdate`,`neededint`) VALUES ('09:00:00','18:00:00','1008','2016-06-20',3);
INSERT INTO `table1` (`StartTime`,`EndTime`,`varid`,`neededdate`,`neededint`) VALUES ('08:00:00','17:00:00','1006','2016-06-21',2);
INSERT INTO `table1` (`StartTime`,`EndTime`,`varid`,`neededdate`,`neededint`) VALUES ('11:00:00','20:00:00','1006','2016-06-22',1);

您的光标确实只有一行。

您正在使用 FOUND_ROWS(),它可以在不使用 SQL_CALC_FOUND_ROWS 的情况下正常工作,但通常会使用它。但在您的情况下,由于您的汇总(总和),您只会返回 1 行。所以这几乎没有意义。 "cursor" 没有什么比一组棘手的数据更重要的了。

我认为使用 CURSOR 毫无意义。事实上,我建议永远不要使用游标。对于具有关系和索引以及性能策略来交付结果的高度调整的 SQL 服务器来说,性能很糟糕。游标就像将低性能机制放入一个经过深思熟虑的流线型健壮引擎中。就像打开 Corvette 上的化油器并扔进一把沙子一样。他们是新开发人员 SQL 在程序上尝试围绕他们的问题思考时想到的东西。我建议你永远不要使用它。

以下是 Cursors 的手册页。您需要一个 LOOP 构造来使用它们,因为您是按照自己的方式逐行移动该游标中的数据。要使它们正确,需要相当多的耐心。尝试谨慎使用它,比如每个应用程序最多使用 1 次,并且使用最棘手的代码,直到您以其他方式解决它。性能真的很糟糕,相信我。

您只需执行以下操作即可将这些值转化为变量。

SELECT MIN(asd.StartTime) , MAX(asd.EndTime) into @myMin,@myMax
FROM table1 asd 
WHERE (((asd.varid)='1006') AND ((asd.neededdate)='2016-06-22') AND ((asd.neededint)=3));

select @myMin,@myMax; -- display them if you want

祝你好运,我有没有提到不要使用游标? :p