前方宣言とはまったく関係ありません。
これは、SQLクエリを使用して関数を呼び出すという事実に対処します。 。ステートメントを使用して関数を呼び出すと、PL / SQLパッケージのスコープ内にいなくなったため、公開されている関数しか呼び出すことができないようです。
理由は 、推測しかできないので、当然のこととは思わないでください。ただし、 PL/SQLとSQLのエンジンは異なります 。したがって、SQLクエリを実行するときは、pl / sqlパッケージ内であっても、SQLのレベルに移動し、SQLエンジンに従ってアクセス許可を再度チェックします。したがって、PL / SQLパッケージ内から実行されることはわかりません。また、プライベート関数の呼び出しを許可する必要があります。
エンジンの違いは簡単に確認できると思います。32000のvarchar2を使用してみてください。これは、pl/sql関数内で機能します。ここで、pl / sql関数を呼び出すと、varchar2(32000)
が返されます。 、失敗します。これは私が遭遇した問題ですが、スニペットを提供するためのデータベースがありません。