Oracle 包规范何时变为无效

Posted

技术标签:

【中文标题】Oracle 包规范何时变为无效【英文标题】:When does an Oracle Package Specification become INVALID 【发布时间】:2016-10-28 00:11:47 【问题描述】:

据我所知,可以在不影响规范的情况下替换和重新编译包体。包规范声明过程和函数,而不是定义它们,因此它们不能引用对象,这会使包规范无效。

我知道当一个包规范使用独立的子程序和其他包来定义它的变量时,它可以引用对象。在这种情况下,更改引用的对象可能会导致规范失效。

是否有任何其他方式可以使 Oracle 包规范依赖(引用)对象并在被引用对象更改或其他方式时变为无效?

【问题讨论】:

【参考方案1】:

在规范中可以定义变量或类型。如果变量是 table.column%type 包规范可能会受到用于定义变量的表上的任何 ddl 操作的影响。同样的情况是在包头我们定义游标的时候。

如果变量定义引用的表和标题中使用的类型,我也会小心交换同义词。

下一个场景是特权。如果包的所有者将失去一些授权(可以说是由于表重新创建)包规范也可能无效。

我希望我写的东西有意义。

【讨论】:

感谢您的回答。当 table.column%type 用作 spec 中声明的子程序的参数类型时,对 table 的 DDL 操作是否会影响 spec。如果是这样,请在您的回答中提及这一点。 @chumakoff 我不确定包规范中的子程序是什么意思。但一般来说,如果你在包声明中有这样的引用 %type (或 rowtype),答案是肯定的,它会受到影响。 子程序是一个过程或一个函数。当你在包规范中声明它时,你应该描述它的签名,即参数的类型和返回值的类型。例如:PROCEDURE my_proc(id employees.employee_id%TYPE) @chumakoff 是的,如果您在程序包规范的标头中有参数 col%type 将在表上更改后无效。

以上是关于Oracle 包规范何时变为无效的主要内容,如果未能解决你的问题,请参考以下文章

获取 ORA-01747:使用动态插入插入数据时,Oracle 中的 user.table.column、table.column 或列规范无效

我们可以在没有规范的情况下在 oracle 中创建一个包,反之亦然

如何将 ResultSet 与 oracle 包规范中声明的游标相关联?

Oracle 错误 PLS-00323:子程序或游标在包规范中声明,必须在包主体中定义

第 3 行错误:PL/SQL: ORA-01747: 无效的 user.table.column、table.column 或列规范

何时使用 Unicode 规范化表格 NFC 和 NFD?