PL/SQL包级别异常处理

BeR*_*ack 2 sql oracle plsql

我有一个相当简单的问题:是否可以在包级别进行异常处理?如果是的话,如何实施呢?

我的包中有程序和函数,如果是,NO_DATA_FOUND我想在我的所有程序和函数中做同样的事情.

所以我的问题是:我可以写

WHEN NO_DATA_FOUND THEN
Run Code Online (Sandbox Code Playgroud)

只需一次,并NO_DATA_FOUND在我的所有过程/函数中使用相同的行作为异常,或者我必须在每个过程/函数中编写该异常处理程序.

Ale*_*ole 5

不,您无法在包中的所有过程/函数中全局处理异常.

异常处理程序文档说:

异常处理程序处理引发的异常.异常处理程序出现在匿名块,子程序,触发器和包的异常处理部分中.

这听起来像你可以; 但那里的'包'引用是指create package body声明的初始化部分:

在此输入图像描述

但是该部分"初始化变量并执行任何其他一次性设置步骤",并且每次会话运行一次,此时首次调用包中的函数或过程.它的异常处理程序不做任何其他事情.

如果你真的想要类似的行为,那么你可以把它放到它自己的(可能是私有的)过程中,并从每个过程/函数的异常处理程序调用它.如果您尝试记录错误,可能会节省一些打字但可能会掩盖真正发生的事情.具体的异常处理可能会更简单,更好,即使这会导致一些重复.