2009-06-29 78 views
0

我希望以下存储程序返回行的一个系列,而它只返回1Mysql的光标/取

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存储例程。

回答

0

你可能想试试这个陈述,而不是你现有的测试。

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

对于不匹配的SQLSTATE值,继续处理程序的缺省操作是EXIT。 “未找到”常数涵盖所有有效的020条件。

+0

它仍然返回相同的单行.. – pistacchio 2009-06-29 18:32:13

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; 
1

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

此过程:

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

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

你能否描述一下你想用这个存储过程实现什么任务?

0

感谢您的回复。 我设法做我所做的与临时表的帮助下,我插入所有的结果,然后选择*从该表。