2010-02-17 53 views
13

你通常在哪里存储你的PL/SQL常量?在包体层面上?在规范中?我也见过一些人在常量中使用专用包中的常量。这方面的最佳做法是什么?哪里可以保存PL/SQL常量?

谢谢。

回答

6

在包体或规范中包含常量的一个缺点是,当您重新编译包时,任何具有PGA包状态的用户会话都会得到ORA-04068。出于这个原因,在一个大的开发环境中,我们采用了一个单独的spec-only包来保存每个包的常量(以及包括全局变量)。然后,我们会制定一条规则,说明这些仅限spec的软件包只允许被他们的“拥有”软件包引用 - 这是我们在代码审查时强制执行的。不是一个完美的解决方案,但它在当时对我们很有用。由于同样的原因,我绝不会推荐one-constant-package-to-rule-them-all,因为每当有人需要引入一个新常量或修改一个现有常量时,所有用户会话都会获得ORA- 04068。

+3

结语完整性:最佳实践通常是将所有事物定义为尽可能接近它们的使用:如果该常量仅由一个过程使用,则在该过程中定义它;如果该常量仅用于包体中,请在包体中定义它(除了上面提到的ORA-04068问题 - 在11gR2中这个问题变得不那么严重了,应该提到,如果使用了版本的话)。 – 2010-02-22 05:46:11

4

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

只有当你想让它们对包裹保密时,你应该把它们放在身体中。

对于那些与特定代码段没有任何关系但与整个模式相关的常量而言,有一个只包含常量的包可能是一个好主意。

1

我宁愿常量是,在默认情况下,在包体中,除非您使用常量作为您的公共包过程/函数的参数值或作为函数的返回值。

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

如果你需要存储像默认语言或类似的东西,然后我将封装这些函数像get_default_language等功能,并保持常量私人。

1

因为包状态 - 常量,变量和代码 - 在第一次调用任何公共变量或包时被缓存在用户的PGA中,所以我会担心“有一个包来规则常量”。包常量(如果是公共的)应该被限定在包中,并且只能被包的方法使用。

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

3

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

+3

那么他们不是真正的“常量”,是吗? :-) – ObiWanKenobi 2011-01-28 10:51:54

+1

_“一个人的常数是另一个人的变量。”_ - Alan Perlis – user272735 2011-08-01 20:04:17

2

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

相关问题