问题 - 是否有可能一个程序可以调用包体内的另一个程序?(让我们想在包体内声明两个程序(不在包规范中).P1 & P2是我的程序。P1可以在包体内调用P2吗?)
答案 0 :(得分:2)
是的,否则包将失去很多功能。在包体中定义但在规范中没有定义的过程是私有的,不能从包外部调用;但当然可以来自内部。
但是,必须在包体正文中的之前定义被调用的过程:
create or replace package p42 as
end p42;
/
Package P42 compiled
create or replace package body p42 as
procedure p2 is
begin
null;
end;
procedure p1 is
begin
p2;
end;
end p42;
/
Package body P42 compiled
No errors.
如果你有相反的方法它将无法编译:
create package body p42 as
procedure p1 is
begin
p2;
end;
procedure p2 is
begin
null;
end;
end p42;
/
Package body P42 compiled
Errors: check compiler log
Errors for PACKAGE BODY STACKOVERFLOW.P42:
LINE/COL ERROR
-------- ------------------------------------------
5/3 PLS-00313: 'P2' not declared in this scope
5/3 PL/SQL: Statement ignored
如果您不想按顺序定义它们,或者因为您有许多无法组织的依赖项的过程而无法定义它们,您还可以声明被调用的过程使用之前的时间 - 仍在体内,并使用与规范中的公共过程相同的语法:
create or replace package body p42 as
-- declare private procedure so it can be called before it is fully defined
procedure p2;
procedure p1 is
begin
p2;
end;
procedure p2 is
begin
null;
end;
end p42;
/
Package body P42 compiled
No errors.
在调用过程之前,必须声明并定义它。您可以先声明它(使用 procedure_declaration ),然后在同一个块,子程序或包中定义它(使用 procedure_definition )或同时声明和定义(使用 procedure_definition )。
与包规范一样,如果您的过程有参数,则声明必须完全匹配。当然,这对功能也是如此。
答案 1 :(得分:0)
是的,程序可以调用另一个程序。