2

全部,

在为 Oracle 11i 数据库编写 SELECT 查询时,为什么 Oracle 中的某些表强制将引号应用于被选择的字段,而其他表则没有。

我最近遇到的一个例子:

在查询分析器窗口中的 Aqua Data Studio 中,我尝试从两个不同的表中选择相同的字段:

    select _id from table1
    select _id from table2

table1 和 table2 差别很大,但是只有 table1 执行这个 select 语句没有错误。当我尝试为 table2 执行此语句时,我得到以下信息:

ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 

但是,当我像这样执行第二条语句时,它可以完美运行:

    select "_id" from table2

有谁知道这里发生了什么,为什么会这样,以及导致这种情况的表之间的主要区别是什么?

谢谢

4

2 回答 2

4

关于大小写的答案和链接是正确的,但是您的情况超出了一个简单的案例问题,因为您的列名以下划线开头,并且因为您的客户显然通常对您隐藏引用。

如果您尝试使用名为 的列创建表_id,但不引用它,那么您会收到“ORA-00911:无效字符”错误,其原因文本显示“标识符可能不以字母以外的任何 ASCII 字符开头和数字'; 这实际上也是错误的,因为它也不能以数字开头(例如,0_id给出 'ORA-00904: : invalid identifier')。这是由数据库对象命名规则支持的:

不带引号的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。

因此,看起来 Aqua Data Studio 遵循了将您提供的对象名称的大写版本用双引号括起来的约定,其中一个链接帖子中提到了这种做法。

根据您显示的内容,select _id from ...作为 传递给 Oracle select "_ID" from ...,如果列名创建为"_ID". 似乎是这种情况table1,但table2被创建为"_id"- 因此大小写不匹配会生成您所看到的合法 ORA-00904。

您的客户端没有修改已经包含在双引号中的列名,因此select "_id" from ...按原样传递给 Oracle,并且可以正常工作table2(但相反,会失败table1)。

如果名称不遵循不带引号的标识符的规则,并且如果它被创建为带引号的名称,Oracle 要求将名称括在双引号中 - 除非原始带引号的值无论如何都是有效的,即遵循不带引号的规则并以大写形式输入。由于您的列名以下划线开头,就 Oracle 而言,无论大小写如何,对它的所有引用都必须用双引号引起来。如果您自己没有引用它,您的客户只是在后台执行此操作。

遵循其他人给出的建议以避免引用标识符并始终使用有效的未引用名称将避免此类问题。

于 2013-07-04T15:16:47.060 回答
3

问题来自对象的创建。

如果您创建一个带有小写 AND 引号的对象,它将强制区分大小写。

所以你需要使用引号和正确的大小写来使用它。

如果您创建时不带引号(或全部大写),您将不会遇到任何“区分大小写”的问题,并且能够选择小写或大写的对象(不带引号)

于 2013-07-04T13:49:23.127 回答