使用Oracle中的CREATE命令将列名称包含在双重quoatation标记内无法正常工作.为什么?

Lio*_*ion 13 oracle syntax

让我们考虑products在Oracle 中说一个简单的表(我试过Oracle 9i).我正在使用以下CREATE语句创建此表.

CREATE TABLE products

("prod_id" varchar2(7) primary key, "product_name" varchar2(30) NOT NULL);
Run Code Online (Sandbox Code Playgroud)

需要特别注意的是,我将列名称用双引号括起来,""因为通常我们不这样做.它显然会起作用,并且products将使用具有指定CONSTRAINTS的那两列创建表.


现在,让我们使用以下INSERT INTO命令将一些行插入此表中.

INSERT INTO products VALUES('P0001', 'Nokia-N97');
INSERT INTO products VALUES('P0002', 'Nokia-1208');
INSERT INTO products VALUES('P0003', 'Nokia-1115');
Run Code Online (Sandbox Code Playgroud)

将三行插入products表中.


为确保这些行确实已插入,我们可以按如下方式发出SELECT语句.

SELECT * FROM products;
Run Code Online (Sandbox Code Playgroud)

工作得很好,并显示我们插入的三行.


现在,这里的实际问题.当我们发出以下SELECT语句时

SELECT prod_id, product_name FROM products;
Run Code Online (Sandbox Code Playgroud)

即使我们在这个SQL中没有犯任何错误也无法工作.相反,Oracle会报告此类列不存在.为什么会这样?我想,必须有非常具体的理由.

我确信在我刚刚完成的情况下,不必在双引号内包含列名可能不是最好的做法,但只是我遇到了一个问题.

Jen*_*der 22

反对普遍看法,Oracle在列名和表名中区分大小写.它只是默认将所有内容转换为大写.

但是,如果您在双引号中使用名称,则告诉Oracle以您提供的确切拼写创建列(CREATE语句中的小写).

由于在SELECT语句中,您不使用引号,因此名称将转换为大写,因此不等于CREATE语句中的小写名称.

所以这应该工作:

SELECT "prod_id", "product_name" FROM products;
Run Code Online (Sandbox Code Playgroud)

如果您不知道如何指定列名或表名,可以在数据字典中查找.您将找到表的小写列名product,但是大写表名,因为它没有引用.