回答
在包体或规范中包含常量的一个缺点是,当您重新编译包时,任何具有PGA包状态的用户会话都会得到ORA-04068。出于这个原因,在一个大的开发环境中,我们采用了一个单独的spec-only包来保存每个包的常量(以及包括全局变量)。然后,我们会制定一条规则,说明这些仅限spec的软件包只允许被他们的“拥有”软件包引用 - 这是我们在代码审查时强制执行的。不是一个完美的解决方案,但它在当时对我们很有用。由于同样的原因,我绝不会推荐one-constant-package-to-rule-them-all,因为每当有人需要引入一个新常量或修改一个现有常量时,所有用户会话都会获得ORA- 04068。
在很多情况下,您希望将它们保留在规范中,以便其他软件包可以使用它们,尤其是在从包中调用函数和过程时作为参数。
只有当你想让它们对包裹保密时,你应该把它们放在身体中。
对于那些与特定代码段没有任何关系但与整个模式相关的常量而言,有一个只包含常量的包可能是一个好主意。
我宁愿常量是,在默认情况下,在包体中,除非您使用常量作为您的公共包过程/函数的参数值或作为函数的返回值。
把你的常量放在包规范中的问题是,如果你需要改变常量的类型,其他包可能会失败,因为它只是在那里。如果该常数首先是私有的,那么您不需要对每个更改进行影响分析。
如果你需要存储像默认语言或类似的东西,然后我将封装这些函数像get_default_language
等功能,并保持常量私人。
因为包状态 - 常量,变量和代码 - 在第一次调用任何公共变量或包时被缓存在用户的PGA中,所以我会担心“有一个包来规则常量”。包常量(如果是公共的)应该被限定在包中,并且只能被包的方法使用。
一个常量,其作用域跨越包应该在一个代码表中有一个描述,根据需要加入。毕竟,常量不是,变量也不是。拥有一个“常量”的键值对表使它们全部公开,并且使其动态变化成为可能。
对于我们的应用程序,所有常量都在一个表中。一个简单的函数用于提取它们。没有问题,重新编译,ORA-04068,...
那么他们不是真正的“常量”,是吗? :-) – ObiWanKenobi 2011-01-28 10:51:54
_“一个人的常数是另一个人的变量。”_ - Alan Perlis – user272735 2011-08-01 20:04:17
在我看来最好的选择。将“常量”存储在表中并创建一个通用函数来获取值。否04068
- 1. 我在哪里可以保存NSUserDefaults
- 2. 哪里可以保存gwt-dispatch类?
- 3. 哪里可以保存模型 - Yii
- 4. 哪里可以保存用户文件?
- 5. 我在哪里可以找到SQL和PLSQL参考手册
- 6. 常量数据应存储在哪里?
- 7. 在哪里存储常量字符串
- 8. 函数中的常量字符串 - 它们在哪里保存?
- 9. 在哪里可以通过FileInputStream保存文件以便访问
- 10. 如何以及在哪里可以在Android上保存QSettings?
- 11. 缓存在哪里保存?
- 12. 哪里可以抛出异常句柄?
- 13. 哪里可以定义异常类
- 14. 哪里可以存储大量下载流量的文件?
- 15. 常量编辑器的TYPO3常量在哪里存储?
- 16. 我在哪里可以找到GDK_comma,GDK_dollar,...常量列表?
- 17. 我在哪里可以为Codeigniter(PHP)添加常量文件?
- 18. 我在哪里可以找到C#中的字符常量?
- 19. JSON在哪里存在?我在哪里可以把它
- 20. 哪里可以保存Web应用程序的配置数据?
- 21. 从哪里可以保存一个applet的jpeg文件
- 22. 在哪里可以保存动态网站文字
- 23. 我在哪里可以保存我的Haskell“模块”?
- 24. 哪里可以在应用程序iPhon/iphone中保存文件?
- 25. 我在哪里可以保存小部件的设置?
- 26. 哪里可以保存应用程序日志?
- 27. 我在哪里可以存储受保护的URL?
- 28. 哪里可以实施保存用户特定设置?
- 29. 哪里可以保存用户对项目的评论?
- 30. 哪里可以安全地保存我的重要文件?
结语完整性:最佳实践通常是将所有事物定义为尽可能接近它们的使用:如果该常量仅由一个过程使用,则在该过程中定义它;如果该常量仅用于包体中,请在包体中定义它(除了上面提到的ORA-04068问题 - 在11gR2中这个问题变得不那么严重了,应该提到,如果使用了版本的话)。 – 2010-02-22 05:46:11