让我们考虑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,但是大写表名,因为它没有引用.
| 归档时间: |
|
| 查看次数: |
9805 次 |
| 最近记录: |