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

5

我正在使用Oracle 11g,当我使用查询时出现了以下错误:

select count(*) from potluck;

因此,当我使用:

select count(*) from "potluck";

一切都正常,为什么?

谢谢你。


3
有人用带引号的、大小写敏感的名称创建了一张表 - create table "potluck" ...。当一个表有这样的名称时,唯一可以引用它的方式是使用与第二个例子中相同大小写的带引号的名称。如果可能的话,请将表重命名为非带引号的名称。 - Tony Andrews
同时,在将表重命名为非引用名称后,还需更改所有引用该表的程序。 - San
http://dba.stackexchange.com/questions/63813/why-does-this-simple-select-statement-require-quotes/63814#63814 - Mihai
1个回答

6
在Oracle中,在标识符周围放置双引号会导致Oracle将标识符视为区分大小写,而不是使用默认的不区分大小写。如果您使用双引号创建表格(或列),则必须始终使用双引号引用标识符,并正确指定大小写(除了所有大写标识符,其中双引号无意义)。
在底层,Oracle始终执行区分大小写的标识符匹配。但它总是在执行匹配之前将未加双引号的标识符转换为大写。如果您在标识符周围放置双引号,则Oracle跳过将其转换为大写的步骤。
因此,如果您执行以下操作:
CREATE TABLE my_table( 
col1 number,
col2 number
)

你可以

SELECT * FROM my_table
SELECT * FROM MY_TABLE
SELECT * FROM My_Table
SELECT * FROM "MY_TABLE"

但是类似于这样的东西
 SELECT * FROM "my_table"

会失败。

另一方面,如果您执行以下操作:

CREATE TABLE "my_other_table"( 
col1 number,
col2 number
)

您不能这样做

SELECT * FROM my_other_table
SELECT * FROM MY_OTHER_TABLE
SELECT * FROM My_Other_Table
SELECT * FROM "MY_OTHER_TABLE"

但是这个

SELECT * FROM "my_other_table"

将会起作用


1
个人而言,我认为引用表格(和其他数据库对象)名称是一个错误,即使许多工具会引用这些名称。但是你的看法可能不同。 - user272735

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接