Plsql /游标处理异常并返回到执行流



我正在尝试执行一个游标,并希望它完成循环,即使有一些异常。

我想做的是"catch"所有的异常,可能会记录一些东西,或者什么都不做,然后返回到流。下面是代码的样子:

 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。问:DB是10g,里面没有CONTINUE。因此使用GOTO

将想要在循环中执行的代码放在它自己的块中,然后您可以使用该块的异常部分来处理循环迭代期间的任何问题。

一旦处理了该迭代的异常,下一个循环迭代将开始

例如:

for line in my_cursor
loop
   begin    
      <<do_something>>
   exception
      <<do_exception_processing>>        
   end;
end loop;
为了进一步说明这一点,在下面的例子中,我声明了一个exception类型的局部变量。我正在循环数字1到10,在第二次循环迭代期间,if语句为真,处理传递给异常处理程序。一旦异常被处理,循环的下一次迭代就开始了。
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;
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; 
 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;

最新更新