我正在尝试执行游标并希望它完成循环,即使有一些异常。
我想做的是"赶上"所有的例外和可能记录的事情或什么也不做,然后返回到流程。代码如下所示:
FOR line IN my_cursor
LOOP
begin
if<condition> then
GOTO pass;
else
<<do_something>>
exception
when others then
sys.dbms_output.put_line('say something');
end if;
<<pass>> null;
end
END LOOP;
脚本没有编译。 异常可能存在一些语法错误,但我也不太了解语义。就像我不确定你是否可以在处理异常后返回执行流程。
p.s:DB为10g,并且没有CONTINUE。因此使用GOTO。
答案 0 :(得分:16)
将要在循环中执行的代码放在它自己的块中,然后您可以使用该块异常部分来处理循环迭代期间的任何问题。
一旦处理了该迭代的异常,下一个循环迭代就会开始
e.g:
for line in my_cursor
loop
begin
<<do_something>>
exception
<<do_exception_processing>>
end;
end loop;
为了进一步说明这一点,在下面的例子中,我声明了一个异常类型的局部变量。我循环遍历数字1到10,在第二次循环迭代期间,if语句为true,处理传递给异常处理程序。处理完异常后,循环的下一次迭代开始。
begin
for i in 1 .. 10
loop
declare
my_exception exception;
begin
if i = 2
then
-- if you need to do some processing then you would enter it
-- here and then when you want to enter the exception section
-- you would add the line below
raise my_exception;
end if;
exception
when my_exception then
dbms_output.put_line('in exception section');
end;
end loop;
end;
答案 1 :(得分:7)
FOR line IN my_cursor
LOOP
if not some_condition then
begin
do_something;
exception
when others then log_my_error(); -- this should be something that uses
-- an autonomous transaction
end;
end if;
END LOOP;
答案 2 :(得分:0)
BEGIN
FOR Line in My_Cursor LOOP
IF condition THEN
BEGIN
do something...
END;
ELSE
BEGIN
do something...
END;
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('say something');
END;