这个Oracle代码在做什么?

时间:2014-11-18 12:05:09

标签: sql oracle plsql

我在Oracle网站上发现了这篇文章:Managing Exceptional Behavior, Part 1

在其中,有人定义了一个错误包,包括提升,处理,报告和转发,报告,停止和记录的程序。可以在此处找到此软件包的细目:errpkg

我感兴趣的部分在这里:

IF l_errcode BETWEEN -20999 AND -20000 THEN
    raise_application_error (l_errcode, l_errmsg);
/* Use positive error numbers -- lots to choose from! */
ELSIF l_errcode > 0 AND l_errcode NOT IN (1, 100) THEN
    raise_application_error (-20000, l_errcode || '-' || l_errmsg);
/* Can't EXCEPTION_INIT -1403 */
ELSIF l_errcode IN (100, -1403) THEN
    RAISE NO_DATA_FOUND;
/* Re-raise any other exception. */
ELSIF l_errcode != 0 THEN
    EXECUTE IMMEDIATE
        'DECLARE myexc EXCEPTION; ' ||
        '   PRAGMA EXCEPTION_INIT (myexc, ' || TO_CHAR (err_in) || ');' ||
        'BEGIN  RAISE myexc; END;';
END IF;

该片段的粘贴方式与文章中的内容完全相同。我相信第一个if语句覆盖了所有用户错误,因为-209999到-20000是为用户创建的异常保留的。

在第一个elsif语句中(错误代码> 0而不是(1,00)),根据文章,代码正在执行以下操作:

  

我还处理特定于应用程序的错误的正数   数字。通过处理正面的错误消息编号,我不是   一些,约束在-20,999和-20,000之间的错误数   Oracle也使用它(虽然我远离1和100,唯一   Oracle确实使用的两个正误差数。)

所以对我而言,听起来他很高兴在150,160,170等代码中声明错误,前提是它们不会发生在1到100之间。

然而,该程序的下两部分是做什么的?什么是(100,-1403)中的错误代码?我可以看到它与错误代码01403(未找到数据)有关,但我不理解它在括号(100,-1403)中的位置。什么是立即执行的最终elsif?我正在努力想知道它的目的是什么。

2 个答案:

答案 0 :(得分:4)

如前所述in the exception_int documentation,Oracle可以同时使用-1403和+100来查找未找到的数据'它也在precompiler manuals中提到过; +100用于ANSI模式。所以IN (100, -1403)只是覆盖了没有找到数据时引发的错误的两个可能值。

最后一部分似乎是声明并立即提出了一个命名异常。您只能将raise application error与-20000范围的错误代码一起使用,因此这允许引发内置异常,而无需为所有可能的错误解释或声明编译指示。 no_data_found被明确处理,因为它有两个错误代码,因此调用者可以获得一致的错误,无论哪一个实际发生,大概是。

我很难理解为什么你会使用错误包来解决这个问题 - 这篇文章似乎主张用when others进行捕获,然后使用这种机制来引发一个新的异常相同的代码;这将失去堆栈跟踪。我不明白为什么那会比原来的异常泡沫更自然地好起来。

答案 1 :(得分:0)

l_errcode IN (100, -1403)l_errcode = 100 OR l_errcode = -1403的缩写形式。它可以是任何顺序,l_errcode IN (-1403, 100)具有完全相同的结果。 100和-1403都是没有找到数据的错误代码。

具有execute immediate的最终elsif引发了一个带有用户定义错误消息的异常。需要将用户定义的异常与错误代码EXCEPTION_INIT关联起来:https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/exceptioninit_pragma.htm