のような sql ステートメントがある場合select * from table1
、それはうまく機能しますが、それを関数に入れるとすぐに次のようになります。
ORA-00942: table or view does not exist
これを解決するには?
table1 から選択する権限がロールに付与されている可能性が高く、そのロールがあなたに付与されています。ロールに付与された権限は、ユーザーがロールを付与されていても、ユーザーが作成したPL/SQLでは使用できません。
これは、sys が所有するオブジェクトに対する dba ロールを付与されたユーザーによく見られます。dba ロールを持つユーザーは、たとえば を実行できますがSELECT * from V$SESSION
、 を含む関数を作成することはできませんSELECT * FROM V$SESSION
。
修正は、問題のオブジェクトに対する明示的な権限をユーザーに直接付与することです。たとえば、上記の場合、SYS ユーザーはGRANT SELECT ON V_$SESSION TO MyUser;
あなたが見ることができることがいくつかあります。あなたの質問に基づくと、関数の所有者はテーブルの所有者とは異なるようです。
1)ロールを介した付与:別のユーザーのオブジェクトにストアドプロシージャと関数を作成するには、(ロールを介したアクセスではなく)オブジェクトに直接アクセスする必要があります。
2)
デフォルトでは、ストアドプロシージャとSQLメソッドは、現在のユーザーではなく、所有者の権限で実行されます。
スキーマAでテーブルを作成し、スキーマBで関数を作成した場合は、OracleのInvoker / Definer Rightsの概念を調べて、問題の原因を理解する必要があります。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809
関数がテーブルと同じ DB スキーマにあることを確認してください。