如何重新编译使用 Oracle 10g 的 Wrap 实用程序加密的无效 PLSQL 包?

Posted

技术标签:

【中文标题】如何重新编译使用 Oracle 10g 的 Wrap 实用程序加密的无效 PLSQL 包?【英文标题】:How to recompile invalid PLSQL packages that have been encrypted using Oracle 10g's Wrap utility? 【发布时间】:2011-10-24 11:03:04 【问题描述】:

所以我从 Oracle 10g 模式中导出(使用数据泵),其中所有 PLSQL 包都使用 Oracle 的 Wrap 实用程序加密。问题是当我将它导入新模式时,我的所有包都无效,并且尝试手动编译不起作用。

SQL> ALTER PACKAGE mypackage compile;

Warning: Package altered with compilation errors.

SQL> show errors
Errors for PACKAGE MYPACKAGE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
36/2     PLS-00103: Encountered the symbol "2"

那么重新编译所有这些无效包的解决方案是什么?

【问题讨论】:

导入的数据库是否与源数据库不同? @tbone 是的,我相信这是一个略有不同的版本,但我的一位同事告诉我,它也发生在同一个版本之间。事实上,显然这是 Oracle 中的一个已知错误。虽然仍然没有给我一个解决方案。 :-( 我认为 wrap 不向下兼容(即,不能从较高级别导出并导入较低级别的版本)。这就是为什么我还是问了。此外,我认为 10g 中存在与包装包和数据泵相关的已知错误。你有最新的补丁吗? @tbone 谢谢你。不,我们没有此特定系统的最新补丁。 【参考方案1】:

尝试使用系统DBMS_UTILITY.COMPILE_SCHEMA 过程来编译您的架构对象。此过程将确定编译对象的顺序,甚至处理循环依赖关系。在脚本模式构建之后,调用清理是一个很好的过程。

BEGIN
  DBMS_UTILITY.COMPILE_SCHEMA('MYSCHEMA');
END;
/

我很想知道它处理包裹对象的能力。

【讨论】:

@BrianFenton:感谢您的反馈,很高兴知道。我很好奇它是否能解决这个问题。【参考方案2】:

因此,对于这个问题似乎没有“修复”,只有变通办法,没有一个是理想的。

    使用旧的 exp 和 imp 程序(而不是数据泵)重做导出和导入 如果您有包含包定义的 .SQL 文件,您可以在 SQL*Plus 中手动编译它们(可能有数千个文件,这很重要)。 您可以修补数据库(请参阅 Metalink 文章 460267.1)

【讨论】:

以上是关于如何重新编译使用 Oracle 10g 的 Wrap 实用程序加密的无效 PLSQL 包?的主要内容,如果未能解决你的问题,请参考以下文章

Solaris 10下Qt编译Oracle 10g驱动

Oracle 10g 程序编译错误

oracle 10g sql子句编译错误

已经用管理员账户登录WIN7在安装oracle 10g xe时提示权限不够,需要用管理员账户进行安装?如何解决

oracle10g的存储过程大概怎么调试

oralce11g导出dmp然后导入Oracle10g