替换Oracle软件包的一部分

时间:2010-09-06 14:56:32

标签: oracle stored-procedures plsql

我需要在包中修改一个过程。我需要触及声明和实现。由于我正在为每次修改维护补丁文件,我希望这些更改最小化。

我是否可以仅使用更改的程序更新软件包(如果是,如何?),还是需要提供完整的软件包定义和实现?

5 个答案:

答案 0 :(得分:16)

您需要更换整个包装规格和正文 - 您不能只对包装的一部分进行操作。

答案 1 :(得分:4)

只是为了与其他人发生矛盾。 。 。

从技术上讲,你可以这样做 - 你可以编写一些内容,这些内容将包含在你的补丁文件中,从数据库中检索现有的包源(使用USER_SOURCE),应用你的补丁,然后使用EXECUTE IMMEDIATE重新编译包。

但是,我认为这不是一个好主意 - 基于补丁的修复变得非常难以跟踪,尤其是涉及多个补丁和多个数据库时。将整个文件放入源代码控制中要好得多 - 您的补丁应该仍然清晰可见。

如果补丁是第三方软件包,请考虑将其打包 - 这样除了补丁之外,所有内容都是直接调用。或者将您的补丁放入一个调用第一个补丁的独立包中。仍然存在更改原始包可能与您的补丁不兼容的危险。

答案 2 :(得分:2)

你做不到。据我记忆,避免引用对象失效的唯一方法是不要触及包声明,只执行CREATE OR REPLACE PACKAGE BODY

答案 3 :(得分:1)

由于声明更改,您可以考虑将新过程放入新包中,以避免触及现有过程。无论如何都必须调整使用新版程序的包,以反映声明中的变化(除非它是带有默认值的新参数)。

答案 4 :(得分:1)

如果您使用的是Oracle 11g,并且希望最大限度地减少其他对象的失效,请确保将新声明放在软件包规范的 end 上。