web-dev-qa-db-ja.com

パッケージ仕様の手順

save_db_valuesという名前のパッケージがあります

store_recordsという名前の2つのプロシージャと、db_activitiesという名前のプロシージャがあります。 db_activitiesは、すべての値を渡すことによってアプリケーションから呼び出されますdb_activities挿入と削除を行うためにstore_recordsプロシージャを呼び出します。

パッケージ仕様でstore_recordsプロシージャを定義する必要がありますか?仕様でstore_recordsを定義しなかった場合、エラーstore_records not declared in this scope.が発生します。

store_recordsプロシージャ公開したくないので、仕様を追加しませんでした。この問題を解決するにはどうすればよいですか?

10
Jåcob

一部のプロシージャを公開したくない場合は、パッケージ仕様でそれらを宣言しないでください。パッケージ本体でのみ宣言してください。直面しているエラーの原因は、パッケージ本体のプロシージャの宣言順序または前方宣言の欠如です。例えば:

 create or replace package Test_pkg as
  2    procedure Proc1;
  3  end;
  4  /

Package created

create or replace package body Test_pkg as
  2  
  3    procedure proc1 is
  4    begin
  5      proc2;
  6    end;
  7  
  8    procedure Proc2 is
  9    begin
 10      dbms_output.put_line('proc2 is being executed');
 11    end;
 12  
 13  end;
 14  /

Warning: Package body created with compilation errors
Error: PLS-00313: 'PROC2' not declared in this scope

これは、パッケージの後半で宣言されているProc2を呼び出しているために発生しています。この場合、私たちの選択は次のとおりです。

それを呼び出すプロシージャの前にpro2を宣言します

 create or replace package body Test_pkg as
  2  
  3  
  4    procedure Proc2 is
  5    begin
  6      dbms_output.put_line('proc2 is being executed');
  7    end;
  8  
  9    procedure proc1 is
 10    begin
 11      proc2;
 12    end;
 13  
 14  end;
 15  /

Package body created

前方宣言を使用します。

create or replace package body Test_pkg as
  2  
  3    procedure Proc2;
  4  
  5    procedure proc1 is
  6    begin
  7      proc2;
  8    end;
  9  
 10    procedure Proc2 is
 11    begin
 12      dbms_output.put_line('proc2 is being executed');
 13    end;
 14  
 15  
 16  end;
 17  /

Package body created

SQL> exec test_pkg.Proc1;

proc2 is being executed

PL/SQL procedure successfully completed
31
Nick Krasnov

プロシージャは本文で宣言できますが、表示される順序は重要です。呼び出し元のプロシージャは、呼び出されたプロシージャの後に定義する必要があります。または、前方宣言を使用して簡単にします。

package save_db_values is
   procedure db_activities;
end save_db_values;

package body save_db_values is
   procedure store records; -- forward declaration

   procedure db_activities is
   begin
     store_records;
   end;

   procedure store records is
   begin
      null;
   end;
end save_db_values;
4

これは、パッケージ本体にプロシージャの本体を書き込んでいるために発生しています。パッケージ仕様でプロシージャを宣言していない場合は、最初にそれを記述する必要があります。

それが動作します :)