全部,
在为 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
有谁知道这里发生了什么,为什么会这样,以及导致这种情况的表之间的关键差异是什么?
谢谢
关于大小写的答案和链接是正确的,但你的情况有点超出了一个简单的案例问题,这既是因为你的列名以下划线开头,也是因为你的客户显然通常对你隐藏引用。
如果您尝试创建一个包含名为 _id
的列的表,但没有引用它,那么您会收到“ORA-00911:无效字符”错误,其原因文本为“标识符不得以字母和数字以外的任何 ASCII 字符开头;这实际上也是错误的,因为它也不能以数字开头(例如,0_id
给出 'ORA-00904: : invalid identifier')。这由 database object naming rules 支持:
Nonquoted identifiers must begin with an alphabetic character from your database character set. Quoted identifiers can begin with any
character.
因此,看起来 Aqua Data Studio 正在遵循将您提供的对象名称的大写版本括在双引号中的惯例,其中一篇链接的帖子中提到了这种做法。
根据您所显示的内容,select _id from ...
被传递给 Oracle 作为 select "_ID"from ...
,如果列名称创建为 "_ID"
。 table1
似乎是这种情况,但 table2
是作为 "_id"
创建的 - 因此大小写不匹配会生成合法的 ORA-00904看见了。
您的客户端未修改已包含在双引号中的列名,因此 select "_id"from ...
按原样传递给 Oracle,并且适用于 table2
(但相反,对于 table1
会失败)。
Oracle 要求名称用双引号括起来,如果它不遵循不带引号的标识符的规则,并且如果它是按带引号创建的 - 除非原始带引号的值仍然有效,即遵循不带引号的规则并被输入大写。由于您的列名以下划线开头,就 Oracle 而言,无论大小写如何,所有对它的引用都必须用双引号引起来。如果您自己没有引用,您的客户只是在后台这样做。
按照其他人给出的建议避免使用带引号的标识符并始终使用有效的不带引号的名称可以避免此类问题。