如何定义有状态的pl / sql包?

时间:2013-12-19 16:40:32

标签: java sql oracle plsql

我的java用户收到'单位无法找到'错误但我的包是有效的。 另一篇文章提出了根本原因:我的包裹不能是无国籍的。这是有道理的,但我不清楚Oracle对无状态的真正定义:

如果我从包的SPEC中删除所有声明的类型,它是否也有资格成为无状态?或者我是否也必须从正文中删除所有GLOBAL变量?

这是Oracle如何定义无状态:

  

“包声明的变量,常量和游标的值(在其规范或正文中)构成其包状态。如果PL / SQL包声明至少一个变量,常量或游标,则包是有状态的;否则,它是无国籍的。“

这与此帖中提出的问题相同:

ORA-06508: PL/SQL: could not find program unit being called

1 个答案:

答案 0 :(得分:4)

  

如果我从包的SPEC中删除所有声明的类型,它是否也有资格成为无状态?或者我是否也必须从正文中删除所有GLOBAL变量?

从身体也是如此。规范和正文中声明的变量(或常量或类型等)之间的唯一区别是,正文中的变量是私有的,只能在正文中引用,而规范中的那些可以看到,外部使用。

documentation还提到编译时常量不会使包从11gR2阶段起作用,但是因为你在谈论可能不太有用的变量。

(希望通过'global'你只是指在一个过程或函数之外声明的变量;这些变量仍然限制在一个会话中,它们不是跨会话的全局变量,因为标签可能暗示)。

您可以在遇到错误之前重置任何JDBC连接以运行程序,这样可以让它们继续运行,但这取决于您正在做什么。例如,在WebLogic中,重新编译有状态包之后,我可以重置连接池,该连接池将关闭所有现有连接并打开新连接 - 这些连接具有新的会话,因此具有新的包实例化。

如果会话确实遇到错误,并且没有因此而终止,那么该会话中的下一个包调用应该获得该包的新版本并继续执行;但这仍然是一个有副作用的问题。虽然如果你有一个连接池,同一个程序可以多次看到错误,因为它不断从池中获取新连接,并且其会话遇到状态问题。最终,池中的所有连接都应该获得新版本,或者终止并替换。

正如@pedantic评论的那样,我忽略了这一点,这只是在开发环境中才适用,在这种环境中,短期和重复的更新周期使得必要;即使使用无状态包,您也不应该在使用它时将更改部署到实时系统。