Plsql 在哪里保存PL/SQL常量?

Plsql 在哪里保存PL/SQL常量?,plsql,Plsql,您通常在哪里存储PL/SQL常量?在包体级别上?在说明书中?我还看到一些人在一个专门的包中保存常量,只用于常量。这方面的最佳做法是什么 谢谢。在许多情况下,您希望将它们保留在规范中,以便其他软件包可以使用它们,特别是在从您的软件包调用函数和过程时,将它们用作参数 只有当您想让它们对包保密时,才应该将它们放在主体中 对于那些与任何代码都不相关,但与整个模式相关的常量,只为常量提供一个包可能是一个好主意。默认情况下,我希望常量是,在包体中,除非将常量用作某个公共包过程/函数的参数值或函数的返回值 将

您通常在哪里存储PL/SQL常量?在包体级别上?在说明书中?我还看到一些人在一个专门的包中保存常量,只用于常量。这方面的最佳做法是什么


谢谢。

在许多情况下,您希望将它们保留在规范中,以便其他软件包可以使用它们,特别是在从您的软件包调用函数和过程时,将它们用作参数

只有当您想让它们对包保密时,才应该将它们放在主体中


对于那些与任何代码都不相关,但与整个模式相关的常量,只为常量提供一个包可能是一个好主意。

默认情况下,我希望常量是,在包体中,除非将常量用作某个公共包过程/函数的参数值或函数的返回值

将常量放入包规范中的问题是,如果需要更改常量的类型,其他使用该常量的包可能会失败,因为它就在那里。如果常量首先是私有的,那么不需要对每个更改执行影响分析


如果您需要存储默认语言之类的内容,那么我会将这些内容封装在函数中,如
get\u default\u language
等,并将常量保持私有。

我会担心“一个包来管理常量”,因为包状态--常量、变量,和代码——在第一次调用任何公共变量或包时缓存在用户的PGA中。包常量(如果是公共的)应限定为包的范围,并且仅由包的方法使用


范围跨越包的常量应位于具有描述的代码表中,并根据需要加入。毕竟,常量不是,变量不是。拥有一个包含“常量”的键值对表将使它们全部公开,并使动态更改它们成为可能。

在包体或规范中拥有常量的一个缺点是,当您重新编译包时,在PGA中具有包状态的任何用户会话都将获得ORA-04068。因此,在一个大型开发环境中,我们采用了一种约定,即使用一个单独的spec-only包来保存每个包的常量(以及包全局变量,如果有的话)。然后,我们将强制执行一条规则,规定这些仅限规范的包只允许被其“拥有”的包引用——这是我们在代码审查时强制执行的。这不是一个完美的解决方案,但它在当时对我们有效


出于同样的原因,我从不建议使用一个常量包来管理所有常量,因为每当有人需要引入新常量或修改现有常量时,所有用户会话都会获得ORA-04068。

对于我们的应用程序,所有常量都在一个表中。一个简单的函数用于提取它们。重新编译没有问题,ORA-04068,…

我认为是最好的选择。将“常量”存储在表中,并创建一个通用函数来获取值。第04068号完整性结束语:最佳实践通常是定义尽可能接近其用途的所有内容:如果常数仅由一个过程使用,则在该过程中定义它;如果常数只在包体中使用,则在包体中定义它(除了上面提到的ORA-04068问题-如果使用版本,这在11gR2中不再是一个问题,应该提到)。那么它们不是真正的“常数”,是吗?:-)一个人的常数是另一个人的变量