Mysql Cursor / Fetch

时间:2009-06-29 16:45:50

标签: mysql stored-procedures

我希望以下Stored Routine返回一系列行,而它只返回1

CREATE PROCEDURE example()
    BEGIN
        DECLARE current_id INT;
        DECLARE done INT DEFAULT 0;
        DECLARE cur_main CURSOR FOR SELECT id from tasks;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

        OPEN cur_main;

        FETCH cur_main into current_id;
        lp:WHILE not done DO
            FETCH cur_main into current_id;
            IF done = 1 THEN
                LEAVE lp;
            END IF;
            SELECT * from tasks WHERE id = current_id;
        END WHILE lp;

        CLOSE cur_main;
    END

有任何帮助吗?这是我第一次使用MySQL存储的例程。

4 个答案:

答案 0 :(得分:1)

不幸的是,MySQL不会以这种方式返回多行。

此程序:

CREATE PROCEDURE example()
BEGIN
    SELECT 1;
    SELECT 2;
END;

将返回多个结果集,而不是行。

您能否描述一下您希望通过此存储过程实现哪些任务?

答案 1 :(得分:0)

您可能希望尝试此语句而不是现有测试。

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

对于不匹配的SQLSTATE值,continue处理程序的默认操作是EXIT。 “未找到”常量涵盖所有有效的020条件。

答案 2 :(得分:0)

这是另一种可能性。再看一下你的代码,我注意到你在while循环之前做了一个FETCH,它会给你第一条记录。您进入WHILE循环,然后执行另一个FETCH。通常,您将进入while循环,使用当前记录进行处理,然后在循环循环之前再执行另一个FETCH。此外,通过将下一个FETCH移动到循环体的末端,您也可以删除IF测试。

FETCH cur_main into current_id;
lp:WHILE not done DO
    SELECT * from tasks WHERE id = current_id;
    FETCH cur_main into current_id;
END WHILE lp;

答案 3 :(得分:0)

谢谢你的回复。 我设法在临时表的帮助下做我所做的事情,其中​​我插入所有结果,然后选择* FROM该表。