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