在哪里持有PL / SQL常量?

时间:2010-02-17 09:04:19

标签: plsql

您通常在哪里存储PL / SQL常量?在包体层面?在规范中?我也看到有些人只是为常量而在一个专门的包中保存常量。这个领域的最佳实践是什么?

感谢。

6 个答案:

答案 0 :(得分:6)

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

出于同样的原因,我永远不会建议使用one-constant-package-to-rule-all,因为每次有人需要引入新常量或修改现有常量时,所有用户会话都会得到ORA-04068

答案 1 :(得分:4)

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

只有当你想让它们对包装保密时,才应将它们放在体内。

对于那些与特定代码片段无关但与整个模式相关的常量而言,拥有一个仅用于常量的包可能是一个好主意。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我认为最好的选择。将“常量”存储在表中并创建一个通用函数来获取值。没有04068

答案 4 :(得分:1)

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

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

如果您需要存储默认语言或类似内容等内容,那么我会将这些内容封装在get_default_language等函数中,并将常量保持为私有。

答案 5 :(得分:1)

我担心“一个包来规则常量”,因为包状态 - 常量,变量和代码 - 在首次调用任何公共变量或包时都会缓存在用户的PGA中。包常量(如果是公共的)应该作用于包,并且仅由包的方法使用。

范围跨越包的常量应该在带有描述的代码表中,并根据需要加入。毕竟,常数不是,变量也不是。拥有一个“常量”的键值对表使它们全部公开,并使它们可以动态地更改它们。