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

Posted

技术标签:

【中文标题】ORA-00942: 表或视图不存在(在单独的 sql 中有效,但在 oracle 函数中无效)【英文标题】:ORA-00942: table or view does not exist (works when a separate sql, but does not work inside a oracle function) 【发布时间】:2011-07-12 19:00:28 【问题描述】:

当我有一个像select * from table1 这样的 sql 语句时,它工作得很好,但是一旦我把它放入一个函数中,我就会得到:

ORA-00942: table or view does not exist 

如何解决?

【问题讨论】:

也许该函数属于与表不同的架构? 强相关:oracle “table or view does not exist” from inside stored procedure 【参考方案1】:

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

对于已被授予 sys 拥有的对象的 dba 角色的用户,您会经常看到这种情况。具有 dba 角色的用户可以使用 SELECT * from V$SESSION,但不能编写包含 SELECT * FROM V$SESSION 的函数。

解决方法是直接向用户授予对相关对象的显式权限,例如,在上述情况下,SYS 用户必须GRANT SELECT ON V_$SESSION TO MyUser;

【讨论】:

您能否使用该技术通过完整的 PROCEDURE 示例更新此答案? 不幸的是,我不再从事使用 Oracle 的工作,所以我没有一台机器来测试我编写的任何语法的有效性。不过,如果其他人想试一试,请成为我的客人。【参考方案2】:

您可以查看几件事。根据您的问题,函数所有者似乎与表所有者不同。

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

2)

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

如果您在模式 A 中创建了一个表并在模式 B 中创建了函数,则应该查看 Oracle 的调用者/定义者权限概念以了解可能导致问题的原因。

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

【讨论】:

【参考方案3】:

确保函数与表在同一个数据库架构中。

【讨论】:

如果函数在包内,包也需要和表属于同一个schema? 是的,确实如此。否则,它将无法找到该表。除非您在选择中包含架构名称:select columns from schema.table1【参考方案4】:

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

全部授予 ABC;

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

【讨论】:

【参考方案5】:

一个非常简单的解决方案是在数据库名称中添加您的表名,例如如果您的数据库名称是 DBMS 而表是 info,那么对于任何查询,它将是 DBMS.info

如果您的查询是

select * from STUDENTREC where ROLL_NO=1;

它可能会显示错误,但是

select * from DBMS.STUDENTREC where ROLL_NO=1; 

不是因为现在实际上找到了您的表。

【讨论】:

我有同样的问题,如果你不知道架构,你可以在这里尝试选项#3:techonthenet.com/oracle/errors/ora00942.php,对于这个例子它是:SELECT owner FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND object_name = 'STUDENTREC';

以上是关于ORA-00942: 表或视图不存在(在单独的 sql 中有效,但在 oracle 函数中无效)的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00942: 表或视图不存在,即使它存在

BatchUpdateException:ORA-00942:表或视图不存在

SQL 错误:ORA-00942 表或视图不存在

ORA-00942:表或视图不存在 低级错误一例

ORA-00942: 表或视图不存在解决方法

PL/SQL: ORA-00942: 表或视图不存在