当我有一个像select * from table1
这样的sql语句时,它的效果很好,但只要我把它放到一个函数中,我就会得到:
ORA-00942: table or view does not exist
如何解决这个问题?
答案 0 :(得分:34)
很有可能将从table1中选择的权限授予某个角色,并且该角色已授予您。授予角色的权限不可用于用户编写的PL / SQL,即使该用户已被授予该角色。
对于已在sys拥有的对象上被授予dba角色的用户,您会看到很多。具有dba角色的用户可以使用SELECT * from V$SESSION
,但无法编写包含SELECT * FROM V$SESSION
的函数。
修复是直接向用户授予对相关对象的显式权限,例如,在上面的情况下,SYS用户必须GRANT SELECT ON V_$SESSION TO MyUser;
答案 1 :(得分:16)
你可以看一些东西。根据您的问题,看起来函数所有者与表所有者不同。
1)通过角色授予:为了在另一个用户的对象上创建存储过程和函数,您需要直接访问对象(而不是通过角色访问)。
2)
默认情况下,存储过程和SQL方法执行 他们的所有者的特权,而不是他们当前的用户。
如果您在Schema A中创建了一个表,并且在Schema B中创建了该函数,那么您应该查看Oracle的Invoker / Definer Rights概念,以了解可能导致该问题的原因。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809
答案 2 :(得分:3)
确保该函数与表格在同一个数据库模式中。
答案 3 :(得分:1)
要么您没有该架构/表的权限,要么表存在。 如果您在存储过程中使用其他架构表,则通常会出现此问题。 例如。如果从用户/模式ABC运行存储过程,并且在同一PL / SQL中,则存在来自用户/模式XYZ的表。在这种情况下,ABC应该具有GRANT,即XYZ表的权限
全部授予ABC;
Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
答案 4 :(得分:1)
一个非常简单的解决方案是使用您的表名添加数据库名称,例如,如果您的数据库名称为DBMS
且表格为info
,那么任何查询都将为DBMS.info
。< / p>
如果您的查询是
select * from STUDENTREC where ROLL_NO=1;
它可能会显示错误,但
select * from DBMS.STUDENTREC where ROLL_NO=1;
它没有,因为现在实际上找到了你的桌子。