ORA-00942:表或视图不存在(工程时,一个单独的SQL,但Oracle函数里面不起作用)ORA

2019-05-12 01:00发布

当我有这样一个SQL语句select * from table1 ,它的伟大工程,但只要我把它变成一个功能,我得到:

ORA-00942: table or view does not exist 

如何解决这个问题?

Answer 1:

有一对夫妇的事情,你可以看看。 根据您的问题,它看起来像函数的所有者是表的所有者不同。

1)通过一个角色授予:为了创造另一个用户的对象存储过程和函数,你需要通过角色直接访问对象(而不是访问)。

2)

默认情况下,存储过程和SQL方法执行与它们的主人,而不是他们的当前用户的权限。

如果创建的架构A表和架构B的功能,你应该看一看Oracle的祈求/定义者权限的概念来理解可能会导致问题。

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



Answer 2:

有一个很大的机会的特权,从表1中选择已授予一个角色,而角色已被授予给你。 授予角色权限不提供给用户编写的PL / SQL,即使用户已被授予角色。

你这看到很多关于已被授予由SYS拥有的对象DBA角色的用户。 具有DBA角色的用户将能够,比如说, SELECT * from V$SESSION ,但不能写,包括函数SELECT * FROM V$SESSION

解决方法是有问题给用户的对象上直接授予明确权限,例如,在上述情况下,所述SYS用户必须GRANT SELECT ON V_$SESSION TO MyUser;



Answer 3:

确保功能是在同一个数据库架构的表。



Answer 4:

要么ü也无权进行该模式/表或表确实存在。 如果您使用存储过程中的其他模式中的表多发生这个问题。 例如。 如果您正在从用户/ ABC模式,并在相同的PL / SQL存储过程有表是从用户/架构XYZ。 在这种情况下,ABC应该有GRANT即XYZ表的权限

GRANT ALL ON以ABC;

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


Answer 5:

一个非常简单的解决方案是用你的表名加上数据库名称一样,如果你的数据库的名字是DBMS和表info那么这将是DBMS.info任何查询。

如果您的查询是

select * from STUDENTREC where ROLL_NO=1;

它可能会显示一个错误,但

select * from DBMS.STUDENTREC where ROLL_NO=1; 

它不会因为现在实际上你的表中找到。



文章来源: ORA-00942: table or view does not exist (works when a separate sql, but does not work inside a oracle function)