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

ORA-00942:表或视图不存在(在单独的sql中工作,但在oracle函数中不工作),sql,oracle,oracle9i,ora-00942,Sql,Oracle,Oracle9i,Ora 00942,当我有一个sql语句,如表1中的select*时,它工作得很好,但当我将它放入函数中时,我得到: ORA-00942: table or view does not exist 如何解决此问题?确保函数与表位于相同的DB模式中。您可以查看以下几点。根据您的问题,看起来函数所有者与表所有者不同 1通过角色授予:为了在其他用户的对象上创建存储过程和函数,您需要直接访问对象,而不是通过角色访问 二, 默认情况下,存储过程和SQL方法使用 其所有者的权限,而不是其当前用户的权限 如果您在模式a中创建

当我有一个sql语句,如表1中的select*时,它工作得很好,但当我将它放入函数中时,我得到:

ORA-00942: table or view does not exist 

如何解决此问题?

确保函数与表位于相同的DB模式中。

您可以查看以下几点。根据您的问题,看起来函数所有者与表所有者不同

1通过角色授予:为了在其他用户的对象上创建存储过程和函数,您需要直接访问对象,而不是通过角色访问

二,

默认情况下,存储过程和SQL方法使用 其所有者的权限,而不是其当前用户的权限

如果您在模式a中创建了一个表,在模式B中创建了一个函数,那么您应该了解一下Oracle的Invoker/Definer Rights概念,以了解可能导致此问题的原因


从表1中选择的权限很有可能已授予角色,并且该角色已授予您。授予角色的权限对于用户编写的PL/SQL不可用,即使该用户已被授予该角色

对于被授予sys拥有的对象的dba角色的用户,您可以看到很多这样的情况。具有dba角色的用户将能够(比如)从V$SESSION中选择*,但不能编写包含SELECT*from V$SESSION的函数


修复方法是直接向用户授予有关对象的显式权限,例如,在上述情况下,SYS用户必须向MyUser授予SELECT on V_u$SESSION

要么您没有该架构/表的权限,要么该表确实存在。 如果您在存储过程中使用其他模式表,则通常会出现此问题。 例如,如果您正在从user/schema ABC运行存储过程,并且在同一PL/SQL中有来自user/schema XYZ的表。在这种情况下,ABC应具有XYZ表的权限

把所有的钱都给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; 

这不是因为现在实际找到了表。

可能函数属于与表不同的模式?密切相关:如果函数位于包中,则包也需要与表属于相同的模式?是的,它属于。否则,它将无法找到该表。除非您在schema.table1的select:select列中包含架构名称,否则您是否能够使用该技术用完整的过程示例更新此答案?不幸的是,我不再从事使用Oracle的工作,因此我没有一台机器来测试我将编写的任何语法的有效性。不过,如果其他人想尝试一下,请便。我也有同样的问题,如果你不知道模式,你可以在这里尝试选项3:,例如:从所有对象中选择owner,其中object_键入'TABLE','VIEW',object_name='STUDENTREC';