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プロシージャ公開したくないので、仕様を追加しませんでした。この問題を解決するにはどうすればよいですか?
一部のプロシージャを公開したくない場合は、パッケージ仕様でそれらを宣言しないでください。パッケージ本体でのみ宣言してください。直面しているエラーの原因は、パッケージ本体のプロシージャの宣言順序または前方宣言の欠如です。例えば:
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
プロシージャは本文で宣言できますが、表示される順序は重要です。呼び出し元のプロシージャは、呼び出されたプロシージャの後に定義する必要があります。または、前方宣言を使用して簡単にします。
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;
これは、パッケージ本体にプロシージャの本体を書き込んでいるために発生しています。パッケージ仕様でプロシージャを宣言していない場合は、最初にそれを記述する必要があります。
それが動作します :)