为什么 Oracle 12c 查询需要 table 左右的双引号
Why does Oracle 12c query require double quotes around table
我查询的数据库是Oracle 12c。数据库版本详细信息如下:
Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产
PL/SQL 版本 12.1.0.2.0 - 生产
我试图消除在每个视图周围使用双引号或 SQL 查询中的 table 的需要。
以下作品(来自 Oracle Sql 开发者 GUI)
select m."Metadata"
from "EvMetadata" m
以下给出错误(来自 Oracle Sql 开发者 GUI)
select m.Metadata
from EvMetadata m
错误是
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action: Error at Line: 2 Column: 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 的评论,很可能这就是 table 的创建方式 - 使用双引号。我使用 ORM Entity Framework Code First 为我生成模式,所以 ORM 似乎默认使用双引号。
也许您用双引号创建了 table?
使用双引号会保留大小写,并且由于 table 名称在您的示例中同时包含大写和小写字母,Oracle 只能在您使用双引号时找到它。
如果没有双引号,Oracle 可能默认使用单一大小写(大写?),而不管您在 table 中可能有的任何大小写。
例如:
如果您使用
创建 table
create table "TaBlE_NaMe" (blah..)
那么您必须在 SELECT.
中使用双引号
如果您使用
创建 table
create table TaBlE_NaMe (blah..)
不带引号的 SELECT 应该可以正常工作。 (如果 table 名称的所有字母都大写,它也可以与引号一起使用)
oracle 中的名称,无论是 table、列、对象、视图、包、过程、函数等,默认情况下都是大写的,除非用双引号引起来。此外,oracle 中的所有名称解析都区分大小写。
这意味着当您创建或尝试使用数据库对象而不引用名称时,oracle 会在创建对象或解析名称之前将该名称隐式转换为大写。因此,未加引号的 EvMetadata
table 名称等效于带引号的大写 "EVMETADATA"
table 名称,但不等于带引号的混合大小写 "EvMetadata"
table 名称。
我查询的数据库是Oracle 12c。数据库版本详细信息如下:
Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产
PL/SQL 版本 12.1.0.2.0 - 生产
我试图消除在每个视图周围使用双引号或 SQL 查询中的 table 的需要。
以下作品(来自 Oracle Sql 开发者 GUI)
select m."Metadata"
from "EvMetadata" m
以下给出错误(来自 Oracle Sql 开发者 GUI)
select m.Metadata
from EvMetadata m
错误是
ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist" *Cause:
*Action: Error at Line: 2 Column: 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 的评论,很可能这就是 table 的创建方式 - 使用双引号。我使用 ORM Entity Framework Code First 为我生成模式,所以 ORM 似乎默认使用双引号。
也许您用双引号创建了 table? 使用双引号会保留大小写,并且由于 table 名称在您的示例中同时包含大写和小写字母,Oracle 只能在您使用双引号时找到它。
如果没有双引号,Oracle 可能默认使用单一大小写(大写?),而不管您在 table 中可能有的任何大小写。
例如: 如果您使用
创建 tablecreate table "TaBlE_NaMe" (blah..)
那么您必须在 SELECT.
中使用双引号如果您使用
创建 tablecreate table TaBlE_NaMe (blah..)
不带引号的 SELECT 应该可以正常工作。 (如果 table 名称的所有字母都大写,它也可以与引号一起使用)
oracle 中的名称,无论是 table、列、对象、视图、包、过程、函数等,默认情况下都是大写的,除非用双引号引起来。此外,oracle 中的所有名称解析都区分大小写。
这意味着当您创建或尝试使用数据库对象而不引用名称时,oracle 会在创建对象或解析名称之前将该名称隐式转换为大写。因此,未加引号的 EvMetadata
table 名称等效于带引号的大写 "EVMETADATA"
table 名称,但不等于带引号的混合大小写 "EvMetadata"
table 名称。