0

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

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

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

4

3 回答 3

4

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

  1. 不写输出,而是将记录存储在 PL/SQL 表中
  2. 用 FORALL .. SAVE EXCEPTIONS 替换你的循环
  3. 使用普通 SQL INSERT,结合错误行的错误表(使用dbms_errlog创建错误表)

就个人而言,如果您的函数可以从 SQL 调用,我会选择 3)。

于 2013-04-03T14:21:46.403 回答
0

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

于 2013-04-03T14:20:24.063 回答
0

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

WHEN OTHERS 应该保留用于意外行为并且它应该使您的程序崩溃。它不应该被用作常规处理逻辑的一部分。正确的方法是确定函数返回什么错误。然后你的调用程序需要明确处理那个/那些错误。您的问题实际上可能是该函数正在与 WHEN OTHERS 一起做一些愚蠢的事情。

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

于 2017-05-15T17:05:49.687 回答