我是Oracle世界的新手。我最近在Oracle中创建了一个数据库链接来从SQL Server获取数据,并且我能够获取数据。
SELECT * FROM emp@dblink
上面的查询从SQL Server上托管的"emp"表中获取所有行。
但是,当我引用如下所示的特定列时,Oracle抛出了一个错误。
--This query failed
SELECT empid FROM emp@dblink
错误:ORA-00904:"EMPID":无效标识符
但当我用双引号将empid列括起来时,它就开始工作了。
--This query passed
SELECT "empid" FROM emp@dblink
我想知道为什么在引用单个列时没有用双引号将其括起来会出现错误。
在Oracle中,数据字典中的列通常不区分大小写,因为:
select empno from EMP
select EMPNO from emp
select EMPNO from Emp
将很高兴地与被称为EMP的数据字典中被称为EMPNO的列相匹配。如果你想区分大小写,那么你可以使用双引号,例如
select "EmpNo" from EMP
只要EMP表最初定义为:
create table emp ("EmpNo" int)
等等。SQL Server不同,它在字典中保留大小写,所以当我们通过数据库链接从Oracle查询它时,我们保留了大小写。因此,SQL Server中名为MixedCase的列必须引用为Oracle中的"MixedCCase"。
[TL;DR]最简单的做法是永远不要在对象名称周围使用双引号,只让oracle以默认方式管理区分大小写的数据库,如果您通过dblink引用区分大小写数据库中的列,则用大写字母命名这些列,这样您就不必在oracle中使用双引号
默认情况下,Oracle数据库区分大小写;然而,在默认情况下,他们也会将所有内容转换为大写,这样就可以从用户中抽象出区分大小写的内容。
CREATE TABLE emp ( empid NUMBER(12,0) );
然后:
SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;
将给出相同的输出和:
SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;
输出:
TABLE_NAME COLUMN_NAME
---------- -----------
EMP EMPID
(请注意,表名是大写的)。
如果你使用双引号,那么oracle将尊重你在对象标识符中使用的大小写:
CREATE TABLE emp ( "empid" NUMBER(12,0) );
然后:
SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;
输出:
TABLE_NAME COLUMN_NAME
---------- -----------
EMP empid
(注意:Oracle尊重empid
列的大小写敏感性)。
现在您只能使用引用该列
SELECT "empid" FROM emp;
并且这些查询将失败:
SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;
由于Oracle将标识符转换为大写,并且没有EMPID
列,只有empid
列。
使用双引号引用该列,或者将该列重命名为EMPID
,以允许您利用Oracle从用户抽象区分大小写的默认行为(但这可能会破坏其他在非大写列名上使用双引号的查询)。