2010-07-11 16 views
5

Pour utiliser dynamiquement des curseurs utilisant MySQL, est-il possible de déclarer un curseur dans une boucle d'une procédure stockée? J'ai essayé et eu une erreur:Utilisation du curseur dans une boucle d'une procédure stockée

increment: LOOP 
DECLARE cur1 CURSOR FOR SELECT person_id, publication_id FROM p_publication WHERE person_id = new_count; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
OPEN cur1; 
REPEAT 
    FETCH cur1 INTO pub_id, per_id; 
IF NOT done THEN 
      INSERT INTO test.t2 VALUES (pub_id, per_id); 
    END IF; 
SET new_count = new_count + 1; 
    UNTIL done END REPEAT; 

    CLOSE cur1; 
IF !(new_count < old_count) THEN LEAVE increment; 
END IF; 
END LOOP increment; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE cur1 CURSOR FOR SELECT person_id, publication_id FROM person_has_public' at line 12

Merci à l'avance

Répondre

13

Vous pouvez faire ce que vous voulez en imbriquant le curseur dans un bloc BEGIN ... END. Voir article Roland Bouman's "Nesting MySQL Cursor Loops" pour plus de détails. Il peut être utile de noter que ses commentaires sur cette technique sont souvent inutiles, car il est souvent possible de réécrire la requête au lieu d'avoir à exécuter un curseur imbriqué.

Si vous avez besoin encore nicher votre curseur dans une boucle, votre code devrait ressembler à ceci:

increment: LOOP 
    block_cursor: BEGIN 
     DECLARE cur1 CURSOR FOR SELECT person_id, publication_id FROM p_publication WHERE person_id = new_count; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
     OPEN cur1; 
     REPEAT 
      FETCH cur1 INTO pub_id, per_id; 
      IF NOT done THEN 
       INSERT INTO test.t2 VALUES (pub_id, per_id); 
      END IF; 
      SET new_count = new_count + 1; 
     UNTIL done END REPEAT; 
     CLOSE cur1; 
     IF !(new_count < old_count) THEN 
      LEAVE increment; 
     END IF; 
    END block_cursor; 
END LOOP increment; 
+0

+1: Pour traiter la syntaxe du curseur. –

+0

Merci ça marche – Novemberland