2010-07-11 11 views
5

Um Cursor dynamisch mit MySQL zu verwenden ist es möglich, einen Cursor in einer Schleife einer gespeicherten Prozedur zu deklarieren? Ich habe versucht, und bekam eine Fehlermeldung:Verwendung von Cursor in einer Schleife einer gespeicherten Prozedur

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

Vielen Dank im Voraus

Antwort

13

Sie können tun, was Sie in einem BEGIN ... END Block durch Verschachtelung der Cursor wollen. Weitere Informationen finden Sie unter Roland Bouman's "Nesting MySQL Cursor Loops" Artikel. Es mag erwähnenswert sein, dass seine Kommentare zu dieser Technik oft unnötig sind, da es oft möglich ist, die Abfrage neu zu schreiben, anstatt einen verschachtelten Cursor ausführen zu müssen.

Sollten Sie müssen noch nisten Sie den Cursor in einer Schleife, sollten Sie den Code wie folgt aussehen:

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: Für den Cursor Syntax Adressierung. –

+0

Danke, es funktioniert – Novemberland