Использование курсора в цикле хранимой процедуры - PullRequest
6 голосов
/ 11 июля 2010

Чтобы динамически использовать курсоры с использованием 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;

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашему MySQL версия сервера для правильного синтаксиса для использования рядом с 'DECLARE cur1 CURSOR FOR SELECT person_id, ID_публикации FROM person_has_public 'в строке 12

Заранее спасибо

1 Ответ

15 голосов
/ 11 июля 2010

Вы можете делать, что хотите, вложив курсор в блок BEGIN ... END. Подробнее см. статью Роланда Баумана "Вложенные циклы курсора MySQL" . Возможно, стоит отметить, что его комментарии о том, что этот метод часто является ненужным, так как часто можно переписать запрос вместо выполнения вложенного курсора.

Если вам все еще нужно поместить курсор в цикл, ваш код должен выглядеть примерно так:

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;
...