从公共调用私有包过程



我正在尝试创建一个包含公共和私有过程的包,如下所示。但我无法编译它:

create or replace package tst_pkg
as
    procedure local_pkg ( p_id integer );
end tst_pkg;
/
create or replace package body tst_pkg
as
    procedure local_pkg ( p_id integer )
    is
    begin
            dbms_output.put_line ( 'P_ID: ' || p_id );
            dbms_output.put_line ( 'Now calling PRIV_PROC' );
            tst_pkg.priv_proc ( 999 );
    end;
    procedure priv_proc ( p_id integer )
    is
    begin
            dbms_output.put_line ( 'In PRIV_PROC P_ID: ' || p_id );
    end;
    end tst_pkg;
    /

最简单的方法是将您的私人程序放在包的首位。打包的过程或函数只能看到包正文中公共的或在其前面声明的过程或函数。

create or replace package body tst_pkg
as
    procedure priv_proc ( p_id integer )
    is
    begin
            dbms_output.put_line ( 'In PRIV_PROC P_ID: ' || p_id );
    end;
    procedure local_pkg ( p_id integer )
    is
    begin
            dbms_output.put_line ( 'P_ID: ' || p_id );
            dbms_output.put_line ( 'Now calling PRIV_PROC' );
            tst_pkg.priv_proc ( 999 );
    end;
    end tst_pkg;
    /

有时,您可能会有过程 BLUE 调用过程 RED 和过程 RED 调用过程 BLUE 的代码,并且您必须使用前向声明变得复杂

create or package body pkg_col is
  --
  procedure blue (p_in in number);
  procedure red (p_in in number;
  --
  procedure blue (p_in in number) is
  begin
    red (1);
  end blue;
  procedure red (p_in in number) is
  begin
    if p_in > 1 then
      blue (2);
    end if;
  end red;
end pkg_col;

最新更新