【发布时间】:2012-04-19 18:46:45
【问题描述】:
我的 oracle 实例上有几个包。当我从头开始重新创建数据库时,我得到零个无效对象,并且没有来自 liquibase 的警告。
然后,当我调用一个包方法时,像这样:
new SimpleJdbcCall(jdbcTemplate).withCatalogName(packageName).withProcedureName(storedProcedureName).execute(parameterMap);
它给了我以下错误:
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call CALENDAR_MANAGEMENT.CREATE_SUMMARIES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}]; SQL state [72000]; error code [4063]; ORA-04063: package body "ETPDEV.CALENDAR_MANAGEMENT" has errors
ORA-06508: PL/SQL: could not find program unit being called: "ETPDEV.CALENDAR_MANAGEMENT"
ORA-06512: at line 1;
nested exception is java.sql.SQLException: ORA-04063: package body "ETPDEV.CALENDAR_MANAGEMENT" has errors
ORA-06508: PL/SQL: could not find program unit being called: "ETPDEV.CALENDAR_MANAGEMENT"
ORA-06512: at line 1
Caused by: java.sql.SQLException: ORA-04063: package body "ETPDEV.CALENDAR_MANAGEMENT" has errors
ORA-06508: PL/SQL: could not find program unit being called: "ETPDEV.CALENDAR_MANAGEMENT"
ORA-06512: at line 1
再次检查无效对象没有任何结果。再次编译 CALENDAR_MANAGEMENT 正常完成,没有错误。
我已尝试重新编译完整的架构,但没有成功。
当我从 SQLDeveloper 调用它时,它工作正常。
【问题讨论】:
-
您是否在 Java 和 SQLDeveloper 中使用相同的帐户运行它?
-
您说两个帐户是相同的,但他们都以完全相同的用户身份登录吗?这看起来像是一个经典的权限问题。
-
catalog的含义在jdbc中没有明确定义,可以尝试去掉withCatalogName调用,用包名作为过程名的前缀吗? -
啊哈!通过在 java 端对 user_error 进行一些调用,我能够缩小范围并解决问题。我不知道,在一个单独的测试用例中,另一个包被模拟/替换,然后被退回。 CALENDAR_MANAGEMENT 包中的模式更改导致它无效。通过修复依赖关系,我能够让它始终如一地工作。
-
@JBristow 请将其发布为答案!