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

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

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

  现在让我们再生ORA-04068错误。

  设置恰当的CLASSPATH路径,指向类的根路径和classes12.jar(这个Jar包含Oracle JDBC执行),执行这个类,我们得到下面的结果:

  M:articlesdbj2eearticles>java -cp "M:classes12.jar;.;M:learningjavadbj2ee

  uildclasses" dbj2ee.article2.design1.ExecutePackageProcedureTwice

  Executing the package...

  Sleeping for 20 seconds...

  当Java程序运行到它开始休眠的地方时,我们在一个单独的SQL*Plus会话中重新编译这个包:

  SQL>@pkg_body
  SQL>createorreplacepackagebodypkgas
  2g_constantconstantnumber:=1;
  3procedurep
  4is
  5begin
  6insertintot(x)values(1);
  7endp;
  8endpkg;
  9/
  Packagebodycreated.
  SQL>showerrors;
  Noerrors.

  然后在Java程序结束休眠后,它如预期般地在试图第二次执行这个包的时候丢出ORA-04068错误:

  M:articlesdbj2eearticles>java-cp"M:classes12.jar;.;M:learningjavadbj2ee
  uildclasses"dbj2ee.article2.design1.ExecutePackageProcedureTwice
  Executingthepackage...
  Sleepingfor20seconds...
  Outofsleep...
  Executingthepackage...
  Exceptioninthread"main"java.sql.SQLException:ORA-04068:existingstateofp
  ackageshasbeendiscarded
  ORA-04061:existingstateofpackagebody"ORA92.PKG"hasbeeninvalidated
  ORA-04065:notexecuted,alteredordroppedpackagebody"ORA92.PKG"
  ORA-06508:PL/SQL:couldnotfindprogramunitbeingcalled
  ORA-06512:atline1
  atoracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
  atoracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
  atoracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
  atoracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
  atoracle.jdbc.ttc7.TTC7Protocol.executeFetch(TTC7Protocol.java:955)
  atoracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.ja
  va:2053)
  atoracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.jav
  a:1940)
  atoracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStateme
  nt.java:2709)
  atoracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePrepar
  edStatement.java:589)
  atdbj2ee.article2.design1.ExecutePackageProcedureTwice.executePkg(Execu
  tePackageProcedureTwice.java:38)
  atdbj2ee.article2.design1.ExecutePackageProcedureTwice.main(ExecutePack
  ageProcedureTwice.java:20)

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

正在加载评论...