2017-05-10 12 views
0

パブリックプロシージャとプライベートプロシージャの両方でパッケージを作成しようとしています。しかし、私はそれをコンパイルすることができません:publicからPRIVATEパッケージプロシージャを呼び出す

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; 
    /

答えて

2

最も簡単な方法は、まずあなたのプライベートプロシージャをパッケージに入れます。 パッケージされたプロシージャまたはファンクションは、パブリックのものか、パッケージの本体で前に宣言しているもののみを表示できます。

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呼び出しをどこにコードを持っているかもしれないし、あなたが複雑に取得する必要がforward declarations

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; 
関連する問題