【问题标题】:Using Cursor in a Loop of a stored procedure在存储过程的循环中使用游标
【发布时间】:2011-03-14 13:07:53
【问题描述】:

为了使用 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, 附近使用正确语法的服务器版本, 第 12 行的publication_id FROM person_has_public'

提前致谢

【问题讨论】:

    标签: mysql loops stored-procedures mysql-error-1064 database-cursor


    【解决方案1】:

    您可以通过将光标嵌套在BEGIN ... END 块中来做您想做的事情。有关更多详细信息,请参阅Roland Bouman's "Nesting MySQL Cursor Loops" 文章。值得注意的是,他的 cmets 认为这种技术通常是不必要的,因为通常可以重写查询,而不必执行嵌套游标。

    如果您仍需要将光标嵌套在循环中,您的代码应如下所示:

    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;
    

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多