在PLSQL代码更改后,Java返回SQLException的存储过程调用

时间:2018-04-11 09:27:24

标签: java jdbc weblogic12c ucp

我使用JDBC调用存储过程,并且连接在Oracle WebLogic Server 12c中配置为UCP。以下是我的示例代码段。

String query = "{? = call PACK_GLOBAL_VARIABLES.getBatchDate()};
CallableStatement cs = connection.prepareCall(query);
cs.registerOutParameter(1, Types.DATE);
cs.executeUpdate();

问题是,只要PL / SQL端有任何代码更改,我就会遇到这个异常:

java.sql.SQLException: ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SJN_UAT.PACK_GLOBAL_VARIABLES" has been invalidated
ORA-04065: not executed, altered or dropped package body "SJN_UAT.PACK_GLOBAL_VARIABLES"
ORA-06508: PL/SQL: could not find program unit being called: "SJN_UAT.PACK_GLOBAL_VARIABLES"
ORA-06512: at line 1

通过以下两种方式之一解决此问题:

  1. 重新启动WebLogic Server
  2. 多次编译PL / SQL包(不重新启动Web Logic)
  3. 以上两种方法都不适用于生产环境。 任何人都可以帮助确定这个问题和可能的解决方案吗?

1 个答案:

答案 0 :(得分:0)

在applcation运行时重建包不是一个好习惯。

似乎是oracle和java应用程序的预期行为。

两种可能的解决方案:

  1. 在重建包后更改系统刷新共享池,对数据库有潜在风险
  2. 在java代码中捕获错误代码,如果错误代码是4068,则重新执行包