2013-03-09 49 views
0

我有一个sp有两个嵌套游标。外部游标是客户,内部游标是句点。 当内部游标发生错误时,我想回滚为特定客户完成的操作,并继续处理下一个客户。然而,当下客户执行内部光标(发生异常后),我得到一个“光标已经打开的邮件”mysql嵌套游标已经打开

的代码看起来是这样的:

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声明,那就是当我得到“光标已经打开”

非常感谢您的帮助。

+0

可能需要在捕获异常时关闭内部游标 – shibormot 2013-03-09 23:33:08

回答

0

我在代码中看不到任何事务或提交。我会改变的代码包括以下内容:

  • 为每个客户
  • 开始一个新的事务开始的下一个客户之前提交该事务。
  • 在执行回滚之前关闭周期光标。
0

非常感谢您的帮助@JodyT。我正在发起新的块为客户光标的每一个循环(开始,“如果no_more_customer = 1”块之后”。此外,我正在做的‘承诺’未来之前不幸的是,我不能在这个块的异常处理程序中关闭句点游标(游标周期没有在这个范围中定义 - 编译时错误)。我做了什么来解决这个问题是在内部循环内定义一个异常处理程序继续句柄游标的处理程序)。在这个处理程序中,我关闭句点,然后引发异常以在异常处理程序中执行回滚。