2

我是甲骨文世界的新手。我最近在 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

我想知道为什么当我引用单个列而不用双引号括起来时会出现错误。

4

2 回答 2

0

在 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 不同,它在字典中保留大小写,所以当我们通过 dblink 从 Oracle 查询它时,我们保留了大小写。因此,SQL Server 中名为 MixedCase 的列必须在 Oracle 中引用为“MixedCase”。

于 2019-01-10T08:59:19.480 回答
-1

[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 的默认行为,即从用户那里抽象出区分大小写(但这可能会破坏其他在非大写上使用双引号的查询)案例列名)。

于 2019-01-10T08:58:26.753 回答