是否有可能一个过程可以调用包体内的另一个过程?

时间:2016-01-06 06:50:13

标签: database oracle plsql

问题 - 是否有可能一个程序可以调用包体内的另一个程序?(让我们想在包体内声明两个程序(不在包规范中).P1 & P2是我的程序。P1可以在包体内调用P2吗?)

2 个答案:

答案 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.

总结in the documentation

  

在调用过程之前,必须声明并定义它。您可以先声明它(使用 procedure_declaration ),然后在同一个块,子程序或包中定义它(使用 procedure_definition )或同时声明和定义(使用 procedure_definition )。

与包规范一样,如果您的过程有参数,则声明必须完全匹配。当然,这对功能也是如此。

答案 1 :(得分:0)

是的,程序可以调用另一个程序。