2010-07-11 17 views
5

Per utilizzare i cursori in modo dinamico utilizzando MySQL è possibile dichiarare un cursore in un ciclo di una stored procedure? Ho provato e ottenuto un errore:Utilizzo del cursore in un ciclo di una procedura memorizzata

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

Grazie in anticipo

risposta

13

Si può fare quello che vuoi con l'annidamento il cursore in un blocco BEGIN ... END. Vedere l'articolo Roland Bouman's "Nesting MySQL Cursor Loops" per ulteriori dettagli. Può valere la pena notare che i suoi commenti su questa tecnica spesso non sono necessari, poiché è spesso possibile riscrivere la query anziché dover eseguire un cursore annidato.

Se desiderate comunque a nidificare il cursore in un ciclo, il codice dovrebbe essere simile a questo:

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: Per affrontare la sintassi del cursore. –

+0

Grazie funziona – Novemberland

Problemi correlati