在Java/JDBC中透明处理“ORA-04068”错误

http://tech.ddvip.com   2008年05月08日    社区交流

内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。

  如果你已有系统具有定义了状态的包,那么这个解决方法可能很难执行,因为它可能导致大量的重写。这种情况下你需要衡量是每一次部署出现连续的ORA-04068错误,还是要一次性重写系统。

  我们下一组的解决方法是针对于前面提到的两个解决方法的改进,但它们有较大的缺陷,以至于在这篇文章里使得解决方法1或解决方法2是最终的推荐解决方法。但是,我强烈建议你看看下面两个解决方法来了解它们的机制,并基于你对系统的了解来作出判断。

  解决方法3: 监测ORA-0408错误并重新执行包的存储过程

  这个解决方法将处理错误的责任放到了客户端。它的思想是Oracle 通过生成错误ORA-04068给客户端提供了关于包状态已经被无效化的信息和由客户端来监测这个错误以及作出反应。客户端可以选择重新执行这个存储过程,如果它需要的话。我们已经看到这个解决方法看起来是工作在SQL*Plus 中,当存储过程的执行是在这个错误如意料般的发生之后。我们现在将看看在使用JDBC的Java程序中它的执行以及看看它是否管用。

  首先让我们回到在包pkg中有状态的旧代码。所以我们在包体中重新引进状态,像以前一样——这个代码复制到下面以方便你查看:

  createorreplacepackagebodypkgas
  g_constantconstantnumber:=1;
  procedurep
  is
  begin
  insertintot(x)values(1);
  endp;
  endpkg;
  /
  showerrors;

  假设我们重新编译了包体以便我们具有恰当的新代码。我们将首先在一个Java程序中使用JDBC进行模拟一个会导致ORA-04068错误的环境。为此我们将:

  使用JDBC在Java程序中获得一个连接,

  在Java程序中使用JDBC执行pkg.p 存储过程,

来源:IT专家网    作者:戴羽    责编:豆豆技术应用

正在加载评论...