在Java/JDBC中透明处理“ORA-04068”错误
http://tech.ddvip.com 2008年05月08日 社区交流
内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
假设我们改变了对包pkg的包规范并在我们的系统中安装了一个新的包const。现在我们登录到我们的会话1中并执行这个存储过程——它如意料般地执行成功:
session1>execpkg.p
PL/SQLproceduresuccessfullycompleted.
我们登录到会话2中并重新编译包pkg的这个包规范和包体:
session2>@pkg_spec
session2>createorreplacepackagepkgas
2procedurep;
3endpkg;
4/
Packagecreated.
session2>showerrors;
Noerrors.
session2>@pkg_body
session2>createorreplacepackagebodypkgas
2procedurep
3is
4begin
5insertintot(x)values(const.g_constant);
6endp;
7endpkg;
8/
Packagebodycreated.
session2>showerrors;
Noerrors.
在会话1中,当我们重新执行这个存储过程时,尽管我们重新编译了这个包规定和包体,它仍然执行成功。这是因为这个包状态是在包const中的(它已经被重新编译了),并因此当我们重新编译包pkg时包状态没有改变。.
当我们如下在会话2中重新编译包const时会发生什么呢?:
session2>@const
session2>createorreplacepackageconstas
2g_constantconstantnumber:=1;
3endconst;
4/
Packagecreated.
session2>showerrors;
Noerrors.
如果我们在会话1中重新执行包pkg,我们将如意料般得到ORA-04068错误。这个错误清楚地表明在包const中的包状态改变了,并因此使得依赖于它的包pkg被无效化。
来源:IT专家网 作者:戴羽 责编:豆豆技术应用