ORA-00942:表或视图不存在(当单独的sql工作,但在oracle函数内不起作用)

时间:2011-07-12 19:00:29

标签: sql oracle oracle9i ora-00942

当我有一个像select * from table1这样的sql语句时,它的效果很好,但只要我把它放到一个函数中,我就会得到:

ORA-00942: table or view does not exist 

如何解决这个问题?

5 个答案:

答案 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; 

它没有,因为现在实际上找到了你的桌子。