在哪里保存 PL/SQL 常量?

Posted

技术标签:

【中文标题】在哪里保存 PL/SQL 常量?【英文标题】:Where to hold PL/SQL constants? 【发布时间】:2010-02-17 09:04:19 【问题描述】:

您通常将 PL/SQL 常量存储在哪里?在包装体层面?在规范中?我还看到一些人在专门的包中保存常量,只是为了常量。这方面的最佳做法是什么?

谢谢。

【问题讨论】:

【参考方案1】:

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

出于同样的原因,我永远不会推荐一个常量包来统治他们,因为每次有人需要引入新常量或修改现有常量时,所有用户会话都会收到 ORA-04068 .

【讨论】:

完整的后记:最佳实践通常是定义尽可能接近其用途的所有内容:如果常量仅由一个过程使用,则在该过程中定义它;如果该常量仅用于包体中,则在包体中定义它(除了上面提到的 ORA-04068 问题 - 在 11gR2 中这不再是一个问题,如果使用版本,则应该提及)。跨度> 【参考方案2】:

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

只有当你想让它们对包保持私有时,你才应该将它们放入正文中。

对于那些与任何特定代码段无关但与整个架构相关的常量来说,为常量创建一个包可能是一个好主意。

【讨论】:

【参考方案3】:

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

【讨论】:

那么它们并不是真正的“常数”,是吗? :-) “一个人的常数是另一个人的变量。” - Alan Perlis【参考方案4】:

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

【讨论】:

【参考方案5】:

默认情况下,我希望常量位于包主体中,除非您将常量用作公共包过程/函数之一的参数值或用作函数的返回值。

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于在哪里保存 PL/SQL 常量?的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中使用参数或常量时的性能差异

PL/SQL简介

oracle--pl/sql变量定义----

Oracle PL/SQL - 在过程中使用约束声明常量

在 PL SQL 中使用 varray 作为常量

Oracle PL/SQL 根据 3 个常量检查输入