Oracle包规格失效疑问:调整pkg_1元素顺序致pkg_2失效?
Oracle包规格(Package Spec)失效机制解析
核心原因
Oracle对包规格的依赖校验,基于包元素在符号表中的位置索引,而非元素名称。当被依赖包的元素位置发生变更时,依赖它的对象会因无法匹配原依赖的位置索引,被标记为失效。
对应操作场景逐一解释:
步骤1:初始创建
创建两个包后,pkg_2的v变量引用pkg_1.f_1,此时f_1是pkg_1中第1个元素,pkg_2的依赖记录的是这个位置索引,两者状态均有效。
代码:create or replace package pkg_1 as function f_1 return number; end; create or replace package pkg_2 as v number := pkg_1.f_1; end;步骤2:追加元素到末尾
给pkg_1追加p_1到原有元素之后,f_1的位置索引仍然是第1位,pkg_2依赖的位置没有变化,因此两者状态保持有效。
代码:create or replace package pkg_1 as function f_1 return number; procedure p_1; end;步骤3:调整元素顺序
把p_2放在f_1之前,此时f_1的位置索引从第1位变成了第2位。pkg_2依赖的还是原来的第1位位置,现在这个位置对应的是p_2(和原依赖的函数类型不匹配),Oracle判定pkg_2的依赖结构被破坏,因此标记pkg_2失效;而pkg_1是重新编译后的新对象,状态不受影响。
代码:create or replace package pkg_1 as procedure p_2; function f_1 return number; procedure p_1; end;反之,如果按原有顺序追加
p_2到末尾,f_1的位置索引不变,pkg_2的依赖匹配正常,所以两者均保持有效:create or replace package pkg_1 as function f_1 return number; procedure p_1; procedure p_2; end;
内容的提问来源于stack exchange,提问作者mikcutu
相关产品推荐
相关产品推荐

