我对使规范包无效有一个误解。 我创建了 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');
然后,我在包 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');
...两者都有效
然后,我在包 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 的封装规范失效了。
任何人都可以解释一下,为什么在定义第二个过程后,包会失效,因为 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;
两个套餐均有效。
谢谢你,
它似乎与所谓的“入口点编号”有关,它指的是定义到包规范中的对象的顺序。
*过程或函数的入口点编号由其在 PL/SQL 包代码中的位置决定。添加到 PL/SQL 包末尾的过程或函数会被赋予一个新的入口点编号。
这可以通过
检查select procedure_name, subprogram_id
from user_procedures
where object_name = 'PKG_1';
最好的,