sql - plsql/cursors 处理异常并返回执行流程

标签 sql oracle plsql cursor

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

我试图做的是“捕获”所有异常并可能记录一些事情或什么都不做,然后返回到流程中。下面是代码的样子:

 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;

该脚本无法编译。
异常可能存在一些语法错误,但我也不太了解语义。就像我不确定您是否可以在处理异常后返回执行流程。

ps:数据库是10g,里面没有CONTINUE。因此使用GOTO。

最佳答案

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

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

例如。:

for line in my_cursor
loop
   begin    
      <<do_something>>
   exception
      <<do_exception_processing>>        
   end;
end loop;

为了进一步说明这一点,在下面的示例中,我声明了一个异常类型的局部变量。我循环遍历数字 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;

关于sql - plsql/cursors 处理异常并返回执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566339/

相关文章:

sql - 在 where 子句中使用计算字段

php - 比较和计算 mysql 行中的值

sql - 选择未包含在集合中的下一个日期

mysql - 如何在mysql中获取我的表中的最大且不重复的数据?

mysql - 选择是否使用MySQL语句更新记录

sql - Oracle 11g 日志文件,用于查找过去发生的错误的详细信息 (ORA-00054)

oracle - 推荐一本关于 "expressive"PL/SQL 的书吗?

oracle - PL/SQL - 特定于一个数据库的条件编译

oracle - 此行级触发器发生了什么故障?

mysql - 具有多个相似条件的查询,按 LIKE 排序