2013-10-30 134 views
0

我试图让它像那样,但它只返回单行。 第一次选择后,程序退出。什么是创建计数的MySQL程序的正确方法?

DROP PROCEDURE IF EXISTS testProc; 
DELIMITER $$ 
    CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT) 
    BEGIN 
     DECLARE tmpStep INT; 
     SET tmpStep = start_stamp; 
     WHILE tmpStep < end_stamp DO 
      SELECT tmpStep; 
      SET tmpStep = tmpStep + step; 
     END WHILE; 
    END$$ 
DELIMITER ; 

CALL testProc (1,10,1); 

期望的行为是在这种情况下将数字从1返回到10。

+1

在我的最后工作正常,但你将它们作为单独的结果集返回。你如何执行此代码?从连接器或使用命令行工具? –

+0

@MatsKindahl你是对的,连接器只返回第一个选择。我如何将所有结果作为单个结果集返回? –

+0

它在连接器之间有所不同。对于C API,您可以使用'mysql_more_results'和'mysql_next_result'遍历结果集(http://dev.mysql.com/doc/refman/5.5/en/c-api-multiple-queries.html)。 –

回答

1

要创建一个返回动态生成结果集的过程,必须在内部创建一个临时表,然后选择它。下面的代码应该为你做的工作:

DROP PROCEDURE IF EXISTS testProc; 
DELIMITER $$ 
CREATE PROCEDURE testProc(start_stamp INT, end_stamp INT, step INT) 
BEGIN 
    DECLARE tmpStep INT; 
    DROP TABLE IF EXISTS `testProc$tmp`; 
    CREATE TEMPORARY TABLE `testProc$tmp` (a INT); 
    SET tmpStep = start_stamp; 
    WHILE tmpStep < end_stamp DO 
     INSERT INTO `testProc$tmp` VALUES(tmpStep); 
     SET tmpStep = tmpStep + step; 
    END WHILE; 
    SELECT * FROM `testProc$tmp`; 
END$$ 
DELIMITER ; 

CALL testProc (1,10,1); 

注意,该代码将离开临时表中的函数调用后四处张望,但名字创建的,是“晦涩”,使其不发生冲突一些其他表。

+0

非常感谢您的建议,但是这个过程必须在多用户环境中同时调用,并为每个用户产生有意义的结果,因此共享同一个临时表不是一种选择。 –

+0

每个临时表都是特定于连接的,所以如果您使用不同的连接,则没有问题。换句话说,一个连接上的临时表'foo'与另一个连接上的临时表'foo'不同。 –

相关问题