为啥 Oracle 12c 查询需要在表周围加上双引号 [重复]

Posted

技术标签:

【中文标题】为啥 Oracle 12c 查询需要在表周围加上双引号 [重复]【英文标题】:Why does Oracle 12c query require double quotes around table [duplicate]为什么 Oracle 12c 查询需要在表周围加上双引号 [重复] 【发布时间】:2015-07-22 17:23:10 【问题描述】:

我要查询的数据库是 Oracle 12c。数据库版本详细信息如下:

Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产

PL/SQL 版本 12.1.0.2.0 - 生产

我试图消除在我的 SQL 查询中为每个视图或表加上双引号的需要。

以下作品(来自 Oracle Sql Developer GUI)

select m."Metadata"
from "EvMetadata" m

以下给出错误(来自 Oracle Sql Developer GUI)

select m.Metadata
from EvMetadata m

错误是

ORA-00942: 表或视图不存在 00942. 00000 - “表或视图不存在” *原因: *操作:行错误:2 列:6

我生成了 DDL,看起来像这样

CREATE TABLE "EVP"."EvMetadata" 

("EvMetadataId" NUMBER(10,0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE , 

"InsertDate" TIMESTAMP (6), 

"SessionId" NVARCHAR2(17), 

"FileCheckSum" NVARCHAR2(32), 
"Metadata" NCLOB, 
"Device" NVARCHAR2(20), 
"User" NVARCHAR2(20)
) SEGMENT CREATION IMMEDIATE 

所以根据下面@toddlermenot 的评论,很可能这就是表格的创建方式 - 使用双引号。我使用 ORM Entity Framework Code First 为我生成架构,所以看起来 ORM 默认使用双引号。

【问题讨论】:

这不是 12c 特定的问题,但 Oracle“一直”这样工作。我个人认为引用的表(和其他对象)名称是一个错误,即使许多工具引用了这些名称。 YMMV。 【参考方案1】:

也许您用双引号创建了表格? 使用双引号会保留大小写,并且由于在您的示例中表名同时包含大写和小写字母,Oracle 只有在您使用双引号时才能找到它。

如果没有双引号,默认情况下,Oracle 可能会使用单个大小写(大写?),而不管您在表中可能有任何大小写。

例如: 如果您使用

创建表
create table "TaBlE_NaMe" (blah..)

那么您必须在 SELECT 中使用双引号。

如果您使用创建表

create table TaBlE_NaMe (blah..)

不带引号的 SELECT 应该可以正常工作。 (如果表名的所有字母都是大写的,它也可以与引号一起使用)

【讨论】:

对最后一条语句的小修正:如果创建表 没有 双引号,那么 OP 的 SELECT 带有 双引号不起作用。 @sstan:感谢您的更正,已编辑以解决此问题。【参考方案2】:

oracle 中的名称,无论是表、列、对象、视图、包、过程、函数等,默认情况下都是大写的,除非用双引号引起来。此外,oracle 中的所有名称解析都区分大小写。

这意味着当您创建或尝试使用数据库对象而不引用名称时,oracle 将在创建对象或解析名称之前将该名称隐式转换为大写。所以不带引号的EvMetadata 表名等价于大写的"EVMETADATA" 表名,但不等于带引号的混合大小写"EvMetadata" 表名。

【讨论】:

以上是关于为啥 Oracle 12c 查询需要在表周围加上双引号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

oracle 12c 新特性之不可见字段

为啥我必须使用双引号来连接 2 个表? [复制]

oracle 12c 列式存储 ( In Memory 理论)

需要帮助在 12c 中优化 Oracle 查询

Oracle 12c 关于密码限制的双引号

oracle怎样导入sqlserver数据