12

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

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

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

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

4

3 に答える 3

37

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

 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これは、パッケージの後半で宣言された whichを呼び出しているために発生しています。この場合、私たちの選択肢は次のとおりです。

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
于 2012-10-03T11:29:05.397 に答える
4

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

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;
于 2012-10-03T11:27:49.063 に答える