2010-07-11 3 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 : 커서 구문을 해결하기위한

는 여전히 루프에서 둥지에 커서를해야 할 경우, 코드는 다음과 같이 보일 것입니다. –

+0

고마워요. – Novemberland