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