Java 的存储过程调用在 PLSQL 代码更改后返回 SQLException
Stored Procedure call from Java returning SQLException after PLSQL code changes
我正在使用 JDBC 调用存储过程,连接在 Oracle Web Logic 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
此问题可通过以下两种方式之一解决:
- 重新启动 Web 逻辑服务器
- 多次编译 PL/SQL 包(无需重新启动 Web Logic)
None以上两种方式在Production环境下都是可行的。
任何人都可以帮助确定此问题和可能的解决方案吗?
当应用程序为 运行 时重建包不是一个好习惯。
这似乎是 oracle 和 java 应用程序的预期行为。
两种可能的解决方案:
- rebuild package后alter system flush shared pool,有数据库潜在风险
- 捕获java代码中的错误代码,如果错误代码为4068,则重新执行包
我正在使用 JDBC 调用存储过程,连接在 Oracle Web Logic 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
此问题可通过以下两种方式之一解决:
- 重新启动 Web 逻辑服务器
- 多次编译 PL/SQL 包(无需重新启动 Web Logic)
None以上两种方式在Production环境下都是可行的。 任何人都可以帮助确定此问题和可能的解决方案吗?
当应用程序为 运行 时重建包不是一个好习惯。
这似乎是 oracle 和 java 应用程序的预期行为。
两种可能的解决方案:
- rebuild package后alter system flush shared pool,有数据库潜在风险
- 捕获java代码中的错误代码,如果错误代码为4068,则重新执行包