2010-07-11 94 views
5

因此,爲了使用MySQL動態使用遊標,可以在存儲過程的循環中聲明遊標? 我試着和得到了一個錯誤:在存儲過程的循環中使用遊標

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

在此先感謝

回答

13

你可以做你想做的通過在BEGIN ... END塊嵌套光標。有關更多詳細信息,請參閱Roland Bouman's "Nesting MySQL Cursor Loops"文章。值得注意的是,他對這種技術的評論往往是不必要的,因爲通常可以重寫查詢而不必執行嵌套遊標。

如果您還需要嵌套光標在一個循環中,你的代碼應該是這個樣子:

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:解決光標語法。 – 2010-07-11 19:52:27

+0

感謝它的工作 – Novemberland 2010-07-11 20:03:00