我有一个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
声明,那就是当我得到“光标已经打开”。
非常感谢您的帮助。
可能需要在捕获异常时关闭内部游标 – shibormot 2013-03-09 23:33:08