Oracle 10g 声称一个包体有错误但它没有
Posted
技术标签:
【中文标题】Oracle 10g 声称一个包体有错误但它没有【英文标题】:Oracle 10g claiming that a package body has errors when it does not 【发布时间】: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 请将其发布为答案!
【参考方案1】:
我在集成检查中遇到了这个错误,我没想到在运行包时检查它的有效性。
在调用包之前删除一些简单的代码:
select name || ' - ' || line || ' - ' || text from user_errors order by name, sequence;
我发现另一个测试本身并没有清理,但是这个是,所以当我查看前后的数据库时,它看起来很好。
【讨论】:
以上是关于Oracle 10g 声称一个包体有错误但它没有的主要内容,如果未能解决你的问题,请参考以下文章
win7 安装Oracle10g,使用exp工具导出Oracle11g用户所有数据,报错信息提示EXP-00056: ORACLE-12154