使用“WHEN OTHERS”

时间:2013-04-03 13:44:59

标签: oracle

我有一个问题,我什么时候可以在EXCEPTION块中使用WHEN OTHERS子句而不会让我的代码出错。据我所知,强烈建议尽可能避免这种做法。这是我的情况:

我有一个循环光标的脚本,并将光标中的一些数据插入到表中。
现在,在这个循环中,我正在使用一个函数,如果我试图插入不正确的数据,则会引发异常。因此,当循环命中记录时,不正确的循环中断并且脚本执行停止。我需要做的是注意无法插入数据并从光标转到下一条记录。为此,我在循环中得到异常块,在WHEN OTHERS中捕获异常,通过DBMS_output.put_line发出消息并转到下一条记录。

这是一个很好的方法吗?如果没有,应该怎么做? 谢谢你的任何建议。

3 个答案:

答案 0 :(得分:4)

使用DBMS_OUTPUT进行错误处理几乎不是一个好主意。以下是一些建议 (所有这些都使用某种表结构来存储“无效”行):

  1. 而不是写输出,将记录存储在PL / SQL表中
  2. 用FORALL替换你的循环..保存例外
  3. 使用纯SQL INSERT,并结合错误行的错误表(使用dbms_errlog创建错误表)
  4. 就个人而言,如果可以从SQL调用你的函数,我会去3)。

答案 1 :(得分:0)

仅仅因为不推荐某些东西,并不意味着你在适当的时候不能使用它。如果这符合您的要求并且速度不是太慢,那么请不要担心。您可能会花费三倍的时间来创建一个稍微优雅的解决方案,时间可能会用在其他东西上(或其他人)。

答案 2 :(得分:0)

任何WHEN OTHERS处理程序中的最后一行应该是RAISE;

当其他人应该被保留用于意外行为时,它应该会导致程序崩溃。它永远不应该用作例程处理逻辑的一部分。 对此的正确方法是确定函数返回的错误。然后你的调用程序需要显式处理那些/那些错误。你的问题实际上可能就是这个功能正在和其他人一起做些什么。

http://stevenfeuersteinonplsql.blogspot.com/2017/02/now-not-to-handle-exceptions.html