在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专家网    作者:戴羽    责编:豆豆技术应用

正在加载评论...