MySQL获取不返回值

时间:2016-06-23 15:14:24

标签: mysql cursor

我第一次尝试使用MySQL游标并撞墙。下面的代码片段应该返回tStart和tEnd的实际(非午夜)时间值,但我得到的只是'00:00:00'。表中的StartTime和EndTime字段是TIME类型。仅运行select语句将返回预期值。 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);

1 个答案:

答案 0 :(得分:1)

你的光标确实只有一排。

您使用的FOUND_ROWS()可以在不使用SQL_CALC_FOUND_ROWS的情况下正常工作,但通常会使用它。但在你的情况下,由于你的总和(总和),你将只返回1行。所以它几乎没有任何意义。什么都没有#34;光标"像一组棘手的数据。

我认为使用CURSOR毫无意义。事实上,我建议永远不要使用光标。对于具有关系,索引和性能策略以提供结果的高度优化的SQL Server,性能非常糟糕。游标就像将低性能机制投入到其他故意的流线强健引擎中。就像在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

相关问题