Yourfunction_privateはパッケージ本体でのみ宣言されるため、そのスコープはパッケージ内の他のプロシージャにのみ制限されます。したがって、これらの呼び出しプロシージャの純度レベルに準拠する必要があります。そうしないと、コンパイラは例外をスローします。
この安全な宣言を比較してください(注、私はの純度を拡張しましたfunction_public)...
SQL> CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
2 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
3 PRAGMA RESTRICT_REFERENCES( function_public, WNDS, WNPS, RNDS);
4 END PRAGMA_TEST;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
2 FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
3 BEGIN
4 return 'no harm done';
5 END;
6
7 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
8 BEGIN
9 return function_private(x);
10 END;
11 END PRAGMA_TEST;
12 /
Package body created.
SQL>
...この危険なもので...
SQL> CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
2 FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
3 rv varchar2(1);
4 BEGIN
5 select dummy into rv from dual;
6 return rv;
7 END;
8
9 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
10 BEGIN
11 return function_private(x);
12 END;
13 END PRAGMA_TEST;
14 /
Warning: Package Body created with compilation errors.
SQL> sho err
Errors for PACKAGE BODY PRAGMA_TEST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
9/3 PLS-00452: Subprogram 'FUNCTION_PUBLIC' violates its associated
pragma
SQL>
RESTRICTS_REFERENCES プラグマのポイントは、パッケージ仕様で宣言されたプロシージャが、パッケージ本体のソースにアクセスできない可能性がある他のユーザー (スキーマ) によって所有または実行される SQL ステートメントであっても、他のパッケージで使用できることです。プラグマは、私たちのコードを彼らのコードに組み込むことの影響について、彼らに保証を提供する方法です。そのため、プラグマを仕様で宣言する必要があります。これは、パッケージの EXECUTE を別のユーザーに許可するときに公開されるコードの唯一の部分であるためです。
編集
ああ、改訂されたコード例を見て、あなたが何をしようとしているのか理解できました。機能しない、機能しない、機能しない。spec = public functions - SQL で宣言されているパッケージ化された関数のみを使用できます。SQL が SQL*Plus で記述されているか、別のパッケージ化されたプロシージャでコーディングされているかは問題ではありません。その理由は、エラー スタックで非常に明確です。
SQL> CREATE OR REPLACE PACKAGE PRAGMA_TEST AS
2 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2;
3 PRAGMA RESTRICT_REFERENCES( function_public, WNDS, WNPS);
4 END PRAGMA_TEST;
5 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
2 FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
3 rv varchar2(1);
4 BEGIN
5 select dummy into rv from dual;
6 return rv;
7 END;
8
9 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
10 rv varchar2(1);
11 BEGIN
12 select function_private(x) into rv from dual;
13 return rv;
14 END;
15 END PRAGMA_TEST;
16 /
Warning: Package Body created with compilation errors.
SQL> sho err
Errors for PACKAGE BODY PRAGMA_TEST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/6 PL/SQL: SQL Statement ignored
12/13 PL/SQL: ORA-00904: : invalid identifier
12/13 PLS-00231: function 'FUNCTION_PRIVATE' may not be used in SQL
SQL>
ORA-00904: invalid identifier関数が仕様で宣言されていないため、コンパイラはスローします。純度とは関係ありません。
スコープに関するメモ
PL/SQL は、スコープ ルールに関して完全に一致しているわけではありません。パッケージ化された SQL ステートメントでプライベート変数を使用できます。
SQL> CREATE OR REPLACE PACKAGE BODY PRAGMA_TEST AS
2
3 gv constant varchar2(8) := 'global';
4
5 FUNCTION function_private(y IN VARCHAR2) RETURN VARCHAR2 IS
6 rv varchar2(1);
7 BEGIN
8 select dummy into rv from dual;
9 return rv;
10 END;
11
12 FUNCTION function_public(x IN VARCHAR2) RETURN VARCHAR2 IS
13 rv varchar2(10);
14 BEGIN
15 select gv||'+'||dummy into rv from dual;
16 return rv;
17 END;
18 END PRAGMA_TEST;
19 /
Package body created.
SQL>
SQL ステートメントで使用したい場合に wm が仕様で宣言しなければならないのは関数と型だけです。