包裹失效

问题描述 投票:0回答:1

我对使规范包无效有一个误解。 我创建了 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;

检查时,两者都有效。

select object_name,
       status, object_type
  from user_objects
 where object_type = 'PACKAGE'
   and object_name in ('PKG_1', 'PKG_2');

enter image description here

然后,我在包 pkg_1 的包规范中定义一个过程 P_1

create or replace package pkg_1
as
    function f_1 return number;
    procedure p_1;
end;

...我再次检查两个包裹的状态

select object_name,
       status, object_type
  from user_objects
 where object_type = 'PACKAGE'
   and object_name in ('PKG_1', 'PKG_2');

...两者都有效

enter image description here 然后,我在包 pkg_1 的包规范中定义了第二个过程 P_2

create or replace package pkg_1
as
    procedure p_2;
    function f_1 return number;
    procedure p_1;
end;

...我再次检查两个包裹的状态

select object_name,
       status, object_type
  from user_objects
 where object_type = 'PACKAGE'
   and object_name in ('PKG_1', 'PKG_2');

...但这一次,PKG_2 的封装规范失效了。

enter image description here

任何人都可以解释一下,为什么在定义第二个过程后,包会失效,因为 PKG_1 不受此影响?

另一方面,如果我将 PKG_1 创建为

create or replace package pkg_1
as
    function f_1 return number;
    procedure p_1;
    procedure p_2;
end;

而不是

create or replace package pkg_1
as
    procedure p_2;
    function f_1 return number;
    procedure p_1;
end;

两个套餐均有效。

谢谢你,

oracle plsql
1个回答
0
投票

它似乎与所谓的“入口点编号”有关,它指的是定义到包规范中的对象的顺序。

*过程或函数的入口点编号由其在 PL/SQL 包代码中的位置决定。添加到 PL/SQL 包末尾的过程或函数会被赋予一个新的入口点编号。

https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/schema-object-dependency.html#GUID-AEC8DF50-2AC2-4697-8CA9-F13108FBB810

这可以通过

检查
select procedure_name, subprogram_id 
from   user_procedures
where  object_name = 'PKG_1';

最好的,

© www.soinside.com 2019 - 2024. All rights reserved.