我有一个带有两个嵌套游标的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
语句,那时我得到“光标已经打开”。
非常感谢你的帮助。
答案 0 :(得分:0)
我没有在您的代码中看到任何交易或提交。我会更改代码以包含以下内容:
答案 1 :(得分:0)
非常感谢你的帮助@JodyT。我正在为客户光标的每个循环启动一个新的块(在“if no_more_customer = 1”块之后开始。)我也在下一个客户之前做“提交”。不幸的是我无法在此块的异常处理程序中关闭句点游标(游标周期未在此作用域中定义 - 编译时错误)。我所做的就是在内部循环中定义一个异常处理程序(恰好在继续处理程序之后)句点游标)。在此处理程序中,我关闭句点,然后引发异常以在outter异常处理程序
中执行回滚