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 函数中无效)的主要内容,如果未能解决你的问题,请参考以下文章