2009-06-29 7 views
0

Je pense que le suivant de routine stockée pour retourner une série de lignes, alors qu'il retourne seulement 1Mysql curseur/Fetch

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 

Toute aide? C'est ma toute première fois avec des routines stockées MySQL.

Répondre

0

Vous pouvez essayer cette instruction plutôt que votre test existant. L'action par défaut pour un gestionnaire de continuation est EXIT pour une valeur SQLSTATE non appariée. La constante "NOT FOUND" couvre toutes les conditions 020 valides.

+0

Toujours, il retourne exactement la même rangée .. – pistacchio

0

Voici une autre possibilité. En regardant à nouveau votre code j'ai remarqué que vous faites un FETCH avant votre boucle while qui vous donnera le premier enregistrement. Vous entrez dans la boucle WHILE, puis faites un autre FETCH. Typiquement, vous entrez dans la boucle while, effectuez votre traitement avec l'enregistrement en cours, puis effectuez un autre FETCH juste avant de boucler la boucle. De plus, en déplaçant le FETCH suivant à la fin du corps de la boucle, vous pouvez également supprimer le test 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

Malheureusement, MySQL ne retourne pas plusieurs lignes de cette façon.

Cette procédure:

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

renverra plusieurs resultsets, pas de lignes.

Pourriez-vous décrire la tâche que vous souhaitez accomplir avec cette procédure stockée?

0

Merci pour vos réponses. J'ai réussi à faire ce que j'avais à faire avec l'aide d'une table temporaire où j'insère tous les résultats et ensuite en sélectionnant * FROM cette table.