web-dev-qa-db-ja.com

ORA-00942:テーブルまたはビューは存在しません(個別のSQLで機能しますが、Oracle関数内では機能しません)

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

ORA-00942: table or view does not exist 

これを解決するには?

23
Victor

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

1)ロールを介した許可:別のユーザーのオブジェクトにストアドプロシージャとストアドファンクションを作成するには、(ロールを介したアクセスの代わりに)オブジェクトに直接アクセスする必要があります。

2)

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

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

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

16

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

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

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

35
Steve Broberg

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

3
Adrian Carneiro

そのスキーマ/テーブルに対する権限を持っていないORテーブルは存在します。主にストアドプロシージャで他のスキーマテーブルを使用している場合、この問題が発生しました。たとえば、ユーザーからストアドプロシージャを実行している場合/ schema ABCおよび同じPL/SQLには、user/schema XYZからのテーブルがあります。この場合、ABCにはGRANT、つまりXYZテーブルの特権が必要です。

すべてをABCに付与。

Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
1

非常に簡単な解決策は、DB名がDBMSで、テーブルがinfoの場合、DBMS.info任意のクエリ。

クエリが

select * from STUDENTREC where ROLL_NO=1;

エラーが表示される場合がありますが、

select * from DBMS.STUDENTREC where ROLL_NO=1; 

実際にはテーブルが見つかったからではありません。

1
Ankit Neekhra