7

为了使用 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 服务器版本相对应的手册,以在第 12 行的“DECLARE cur1 CURSOR FOR SELECT person_id,publication_id FROM person_has_public”附近使用正确的语法

提前致谢

4

1 回答 1

15

BEGIN ... END您可以通过将光标嵌套在块中来做您想做的事情。有关更多详细信息,请参阅Roland Bouman 的“嵌套 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;
于 2010-07-11T19:50:18.297 回答