34

のような sql ステートメントがある場合select * from table1、それはうまく機能しますが、それを関数に入れるとすぐに次のようになります。

ORA-00942: table or view does not exist 

これを解決するには?

4

5 に答える 5

49

table1 から選択する権限がロールに付与されている可能性が高く、そのロールがあなたに付与されています。ロールに付与された権限は、ユーザーがロールを付与されていても、ユーザーが作成したPL/SQLでは使用できません。

これは、sys が所有するオブジェクトに対する dba ロールを付与されたユーザーによく見られます。dba ロールを持つユーザーは、たとえば を実行できますがSELECT * from V$SESSION、 を含む関数を作成することはできませんSELECT * FROM V$SESSION

修正は、問題のオブジェクトに対する明示的な権限をユーザーに直接付与することです。たとえば、上記の場合、SYS ユーザーはGRANT SELECT ON V_$SESSION TO MyUser;

于 2011-07-12T19:43:20.010 に答える
22

あなたが見ることができることがいくつかあります。あなたの質問に基づくと、関数の所有者はテーブルの所有者とは異なるようです。

1)ロールを介した付与:別のユーザーのオブジェクトにストアドプロシージャと関数を作成するには、(ロールを介したアクセスではなく)オブジェクトに直接アクセスする必要があります。

2)

デフォルトでは、ストアドプロシージャとSQLメソッドは、現在のユーザーではなく、所有者の権限で実行されます。

スキーマAでテーブルを作成し、スキーマBで関数を作成した場合は、OracleのInvoker / Definer Rightsの概念を調べて、問題の原因を理解する必要があります。

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809

于 2011-07-12T19:23:04.617 に答える
3

関数がテーブルと同じ DB スキーマにあることを確認してください。

于 2011-07-12T19:04:11.677 に答える