【问题标题】:mysql nested cursor is already openmysql嵌套游标已经打开
【发布时间】:2013-03-09 22:01:18
【问题描述】:

我有一个带有两个嵌套游标的 sp。外部光标是客户,内部光标是句点。 当内部光标发生错误时,我想回滚为特定客户所做的事情并继续处理下一个客户。但是,当为下一个客户执行内部光标时(发生异常后)我得到一个 “光标已打开消息”

代码如下所示:

    DECLARE customers CURSOR FOR
    select * from customers_table;

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_customers = 1;

    OPEN customers;

    customers_cursor:
    REPEAT
    FETCH customers
    INTO ....

    IF no_more_customers = 1
    THEN
        close customers;
        LEAVE customers_cursor;
    END IF;

    BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
        rollback;
    END;

    ....... //do some stuff

    BEGIN
        DECLARE no_more_periods INT(1) DEFAULT 0;
        DECLARE periods CURSOR FOR
            SELECT ...

        DECLARE CONTINUE HANDLER FOR NOT FOUND
        SET no_more_periods = 1;

        OPEN periods;

        periods_cursor:
        REPEAT
        FETCH periods INTO...

        IF no_more_periods = 1
        THEN
            close periods;
            LEAVE periods_cursor;
        END IF;

    ..... //do some stuff point 1

        UNTIL no_more_periods = 1
        END REPEAT periods_cursor;
        end;

    END;    

    UNTIL no_more_customers = 1
    END REPEAT customers_cursor;
END;

客户 1 运行并在 //do some stuff point 1 中发生异常。然后客户 2 运行,直到到达 open periods 语句,这就是我得到 “光标已打开”

非常感谢您的帮助。

【问题讨论】:

  • 捕捉异常时可能需要关闭内部光标

标签: mysql cursor nested


【解决方案1】:

我在您的代码中没有看到任何事务或提交。我会更改代码以包含以下内容:

  • 为每位客户开始新的交易
  • 在开始处理下一个客户之前提交此交易。
  • 在执行回滚之前关闭句点光标。

【讨论】:

    【解决方案2】:

    非常感谢@JodyT 的帮助。我正在为客户光标的每个循环启动一个新块(在“if no_more_customer=1”块之后开始)。我也在下一个客户之前做“提交”。不幸的是我无法关闭此块的异常处理程序中的句点游标(此范围编译时错误中未定义游标句点)。我为克服这个问题所做的是在内部循环中定义一个异常处理程序(恰好在的 continue 处理程序之后句点光标)。在此处理程序中,我关闭句点,然后引发异常以在外部异常处理程序中执行回滚

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2012-01-18
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多