Oracle服务器不是那么聪明,无法捕获更新的软件包。 所以每当我重新编译我的包。它会抛出现有的包无效错误。
是否有任何方法可以让我只刷新服务器上的包。因此,我不需要退回服务器并停止每个人都使用的服务器。
答案 0 :(得分:1)
如果您修改了包(让我们称之为PKG_TEST),包括规范和正文,则使用
进行编译alter package pkg_test compile;
如果规范被更改,可能会导致其他依赖对象失效(这可能就是您所看到的)。
但是,如果只修改包体,则不必编译规范(因为它没有改变),而只需要修改体:
alter package pkg_test compile body;
无论你对身体做了什么改变,它们都不会使其他物体无效。因此,选择其中一个命令,具体取决于您对该软件包所做的操作。
答案 1 :(得分:1)
最小化公共函数,过程和变量。在最小化公共对象和最小化包状态后,无效对象和ORA-04068: existing state of packages has been discarded
错误将减少。
包规范中的任何功能或过程都是公开的。更改这些功能和过程可能会更改其他对象使用包的方式,从而导致失效。此外,应彻底记录和测试公共API。这意味着您希望拥有尽可能少的公共API。由于某些原因,大多数Oracle程序不必要地将所有程序和功能放在规范中,而大多数程序和功能只需要在正文中使用。此更改将使您的程序更好,缩小依赖关系并最小化无效对象。
包规范中的任何变量也是公共的,并且将在会话期间保持其值。与任何语言一样,公共变量也应该最小化。由于某些原因,大多数Oracle程序也不必要在规范中放置许多变量,而不是正文。如果规范中没有变量,则没有包状态,您不会看到ORA-04068
。
不要在共享系统上开发。为每个开发人员提供无限数量的数据库,并在版本控制的文本文件中合并更改。有许多简单而廉价的方法可以获得无数的数据库 - 本地安装的数据库,虚拟机,容器等。还有许多简单而便宜的版本控制文本文件的方法 - 每个现代IDE都可以打开并保存文件到文件系统,然后使用Git或SVN之类的东西。
让多个开发人员在单个共享系统上工作根本无法扩展。除了"以这种方式设置起来稍微容易一点,而且实际上没有充分的理由去开发这种方式了。
编译正文,而非规范。正如Littlefoot建议的那样,尝试改变身体而不是规格。 (尽管依赖关系在10g中不那么精细,但这可能没有现代版本那么多。)