繁体   English   中英

mysql嵌套游标已经打开

[英]mysql nested cursor is already open

我有一个带有两个嵌套游标的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语句,这就是我得到“游标已打开”的时间

非常感谢你的帮助。

在您的代码中看不到任何交易或提交。 我将代码更改为包括以下内容:

  • 为每个客户启动新交易
  • 在开始下一个客户之前,先进行此交易。
  • 执行回滚之前,请关闭句点光标。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM