Чтобы использовать курсоры динамично с помощью 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 для правильного синтаксиса для использования рядом, 'ОБЪЯВЛЯЮТ cur1 КУРСОР ДЛЯ ВЫБОРА person_id, publication_id ОТ person_has_public' в строке 12
Заранее спасибо
Вы можете сделать то, что хотите, вложив курсор в BEGIN ... END
блока. Более подробно см. статью Roland Bouman "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;