【发布时间】:2010-02-17 09:04:19
【问题描述】:
您通常将 PL/SQL 常量存储在哪里?在包装体层面?在规范中?我还看到一些人在专门的包中保存常量,只是为了常量。这方面的最佳做法是什么?
谢谢。
【问题讨论】:
标签: plsql
您通常将 PL/SQL 常量存储在哪里?在包装体层面?在规范中?我还看到一些人在专门的包中保存常量,只是为了常量。这方面的最佳做法是什么?
谢谢。
【问题讨论】:
标签: plsql
在包主体或规范中包含常量的一个缺点是,当您重新编译包时,任何在 PGA 中具有包状态的用户会话都会得到 ORA-04068。出于这个原因,在一个大型开发环境中,我们采用了使用单独的规范包来保存每个包的常量(和包全局变量,如果有的话)的约定。然后,我们会强加一条规则,即这些仅限规范的包只允许被它们的“拥有”包引用——我们在代码审查时强制执行了这一规则。这不是一个完美的解决方案,但它在当时对我们有用。
出于同样的原因,我永远不会推荐一个常量包来统治他们,因为每次有人需要引入新常量或修改现有常量时,所有用户会话都会收到 ORA-04068 .
【讨论】:
在许多情况下,您希望将它们保留在规范中,以便其他包可以使用它们,尤其是在从您的包中调用函数和过程时作为参数。
只有当你想让它们对包保持私有时,你才应该将它们放入正文中。
对于那些与任何特定代码段无关但与整个架构相关的常量来说,为常量创建一个包可能是一个好主意。
【讨论】:
对于我们的应用程序,所有常量都在一个表中。一个简单的函数用于提取它们。重新编译没问题,ORA-04068,...
【讨论】:
我认为最好的选择。将“常量”存储在表中并创建一个通用函数来获取值。没有 04068 ?
【讨论】:
默认情况下,我希望常量位于包主体中,除非您将常量用作公共包过程/函数之一的参数值或用作函数的返回值。
将常量放入包规范的问题在于,如果您需要更改常量的类型,其他使用该常量的包可能会失败,因为它就在那里。如果常量一开始是私有的,那么您不需要对每次更改执行影响分析。
如果您需要存储默认语言或类似内容的内容,那么我会将这些内容封装在 get_default_language 等函数中,并将常量保密。
【讨论】:
我会担心“一个包来统治常量”,因为包状态——常量、变量和代码——在第一次调用任何公共变量或包时会缓存在用户的 PGA 中。一个包常量,如果是公共的,则应该限定在包的范围内,并且只能由包的方法使用。
范围跨越包的常量应该在带有描述的代码表中,并根据需要加入。毕竟常量不是,变量也不是。拥有一个由“常量”组成的键值对表使它们全部公开,并使动态更改它们成为可能。
【讨论】: