ORA-00942:可以选择“schema.table”而不是“table”吗?

时间:2011-09-29 01:44:26

标签: oracle ora-00942

执行

时,我遇到了ORA-00942(“表或视图不存在”)
select * from brunch

但是,执行

时没有这样的问题
select * from joe.brunch

我可以知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:9)

不合格,BRUNCH指的是与当前会话中的JOE.BRUNCH不同的对象。你有几个方法可以解决这个问题。

  1. 创建公共同义词。这将允许任何拥有JOE.BRUNCH表权限的用户通过查询BRUNCH

    来访问它

    创建PUBLIC SYNONYM早午餐    FOR joe.brunch

  2. 创建私人同义词。这将允许当前用户通过查询JOE.BRUNCH

    来访问BRUNCH

    创建SYNONYM早午餐    FOR joe.brunch

  3. 将当前会话的当前架构更改为JOE。这将导致当前会话中的所有非限定引用解析为JOE模式而不是当前用户的模式

    ALTER SESSION SET current_schema = JOE

答案 1 :(得分:3)

有几种可能的原因

1)有一个叫做早午餐的对象(表,视图,程序等)。 Oracle不知道您指的是哪一个。

2)最有可能的原因:该表存在于joe架构中,但您正在连接另一个尚未被授予joe.brunch对象选择权的用户

尝试

将joe.brunch选择授予your_user

并尝试此操作,查看有多少个对象与名称早午餐相匹配

选择* 来自all_objects 其中object_type in('TABLE','VIEW') 和object_name ='早午餐';

答案 2 :(得分:0)

我发现我引用的表格(Flyway的schema_version表格)是用双引号创建的......因此无论引用它还需要双引号。

Here's what Oracle says

  

带引号的标识符以双引号(")开头和结尾。   如果使用带引号的标识符命名模式对象,则必须使用   每次引用该对象时都使用双引号。

在实践中,这些有效:

SELECT * FROM MYSCHEMA."schema_version";
SELECT * FROM "MYSCHEMA"."schema_version";

如果没有(> ORA-00942:表格或视图不存在):

SELECT * FROM MYSCHEMA.schema_version;