当我有这样一个SQL语句select * from table1
,它的伟大工程,但只要我把它变成一个功能,我得到:
ORA-00942: table or view does not exist
如何解决这个问题?
当我有这样一个SQL语句select * from table1
,它的伟大工程,但只要我把它变成一个功能,我得到:
ORA-00942: table or view does not exist
如何解决这个问题?
有一对夫妇的事情,你可以看看。 根据您的问题,它看起来像函数的所有者是表的所有者不同。
1)通过一个角色授予:为了创造另一个用户的对象存储过程和函数,你需要通过角色直接访问对象(而不是访问)。
2)
默认情况下,存储过程和SQL方法执行与它们的主人,而不是他们的当前用户的权限。
如果创建的架构A表和架构B的功能,你应该看一看Oracle的祈求/定义者权限的概念来理解可能会导致问题。
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809
有一个很大的机会的特权,从表1中选择已授予一个角色,而角色已被授予给你。 授予角色权限不提供给用户编写的PL / SQL,即使用户已被授予角色。
你这看到很多关于已被授予由SYS拥有的对象DBA角色的用户。 具有DBA角色的用户将能够,比如说, SELECT * from V$SESSION
,但不能写,包括函数SELECT * FROM V$SESSION
。
解决方法是有问题给用户的对象上直接授予明确权限,例如,在上述情况下,所述SYS用户必须GRANT SELECT ON V_$SESSION TO MyUser;
确保功能是在同一个数据库架构的表。
要么ü也无权进行该模式/表或表确实存在。 如果您使用存储过程中的其他模式中的表多发生这个问题。 例如。 如果您正在从用户/ ABC模式,并在相同的PL / SQL存储过程有表是从用户/架构XYZ。 在这种情况下,ABC应该有GRANT即XYZ表的权限
GRANT ALL ON以ABC;
Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
一个非常简单的解决方案是用你的表名加上数据库名称一样,如果你的数据库的名字是DBMS
和表info
那么这将是DBMS.info
任何查询。
如果您的查询是
select * from STUDENTREC where ROLL_NO=1;
它可能会显示一个错误,但
select * from DBMS.STUDENTREC where ROLL_NO=1;
它不会因为现在实际上你的表中找到。