Oracle - 避免失效错误

时间:2010-01-13 15:24:56

标签: sql oracle

我注意到每当我有包级常量(或任何变量)时,每当我重新编译包时,与数据库的持久连接都会出现“包体的现有状态已失效”的错误。

有没有办法避免这种情况?也许通过同义词?在这种情况下,最佳做法是什么?

3 个答案:

答案 0 :(得分:3)

通常,您应该避免替换实时生产实例中的代码。

如果你真的真的必须24/24 7/7,并且你无法安排任何(甚至微小的)停机时间,你将不得不避免包级变量,因为重新编译这样的包会触发上述错误。

您还可以在客户端应用程序中捕获错误并确定要执行的操作。也许你有足够的信息来重新启动客户端正在做的事情。

另见

  

thread on AskTom涵盖了相同的主题。

答案 1 :(得分:1)

问题在于,在上午10:00,会话开始并且常量设置为“A”,然后在上午11:00将其更改为“B”,然后会话“混乱”爆炸。 / p>

Serially_Reusable pragma可能适合您。基本上它不会在调用之间保持状态。所以在11:0 am它将开始使用'B'。如果您可以100%确定不会破坏您的代码,它可以工作。无论何时需要重新初始化常量都可能是一种开销。

另请注意以适当的时间间隔调用DBMS_SESSION.MODIFY_PACKAGE_STATEDBMS_SESSION.RESET_PACKAGE。这可能会减少你得到的错误数量。

您还应该查看新Edition-based redefinition中的11gR2。这是一个更全面的解决方案,但我想你需要升级。

答案 2 :(得分:0)

在过去,我通过将所有与状态相关的内容移动到单独的包中来解决这个问题。

例如,如果我有一个包“CUSTOMER_PKG”,我会将所有全局变量移动到一个名为“CUSTOMER_GLOBALS_PKG”的spec规范包中。

不幸的是,这意味着公开包体中定义的所有私有全局变量。我们必须执行开发标准,以便CUSTOMER_GLOBALS_PKG只允许CUSTOMER_PKG引用。