Oracle 将作用域赋予另一个过程中的私有过程,而无需转发声明

Oracle 将作用域赋予另一个过程中的私有过程,而无需转发声明,oracle,stored-procedures,plsql,forward-declaration,Oracle,Stored Procedures,Plsql,Forward Declaration,我有一个没有fwd的包规范,它有公共程序p1和p2 此外,im具有不带fwd的包体,该包体具有三个程序p1、p2和p3。这里p3是在p1之后创建但在p1内部使用的私有过程 然而,为了在p1内部使用p3,我们可以使用前向声明来提供范围 我需要知道是否有其他方法可以提供p3的作用域,以便我们可以在p1内部调用它,而无需使用转发声明 create or replace package without_fwd is procedure p1; procedure p2; end without_fwd;

我有一个没有fwd的包规范,它有公共程序p1和p2

此外,im具有不带fwd的包体,该包体具有三个程序p1、p2和p3。这里p3是在p1之后创建但在p1内部使用的私有过程

然而,为了在p1内部使用p3,我们可以使用前向声明来提供范围

我需要知道是否有其他方法可以提供p3的作用域,以便我们可以在p1内部调用它,而无需使用转发声明

create or replace package without_fwd is
procedure p1;
procedure p2;
end without_fwd;
/

create or replace package body without_fwd is
procedure p1 is
begin
p3;
end;
procedure p2 is
begin
dbms_output.put_line('Success');
end;
procedure p3 is
begin
dbms_output.put_line('Success 2');
end;
end without_fwd;
/

对于家庭作业,我假设教授只是想让你先定义私有方法(顺便说一句,这通常比在现实世界中创建前向引用更常见)

如果
p3
仅用于
p1
,则可以将其定义为
p1
的一部分,而不是包的专用方法。在现实世界中,这有点不寻常——我从未见过一个经常使用这种方法的代码库,尽管我曾与使用这种方法的人交谈过。我偶尔会使用它来简化数据更改的临时匿名块,仅此而已

create or replace package body without_fwd 
is
  -- Public methods
  procedure p1 
  is
    procedure p3 is
    begin
      dbms_output.put_line('Success 2');
    end;
  begin
    p3;
  end;

  procedure p2 is
  begin
    dbms_output.put_line('Success');
  end;
end without_fwd;

除了在包体中的
p1
之前定义
p3
?请注意,您的示例实际上似乎没有向前声明
p3
?这是一个家庭作业,还是你正在试图解决一些业务问题?这更像是家庭作业问题,但我需要知道我们是否可以在公共过程中使用私有过程,而无需进行前向声明,或者不通过在包规范中指定p3将其公开
create or replace package body without_fwd 
is
  -- Public methods
  procedure p1 
  is
    procedure p3 is
    begin
      dbms_output.put_line('Success 2');
    end;
  begin
    p3;
  end;

  procedure p2 is
  begin
    dbms_output.put_line('Success');
  end;
end without_fwd;