All,
在为 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
有谁知道这里发生了什么,为什么会出现这种情况,以及表之间的关键差异是什么导致了这种情况?
Thanks
关于大小写的答案和链接是正确的,但您的情况超出了简单的大小写问题,这既是因为您的列名称以下划线开头,又因为您的客户显然通常对您隐藏引用。
如果您尝试创建一个包含名为_id
,如果不引用它,那么您会收到“ORA-00911:无效字符”错误,其原因文本为“标识符不能以除字母和数字之外的任何 ASCII 字符开头”;这实际上也是错误的,因为它也不能以数字开头(例如,0_id
给出“ORA-00904::无效标识符”)。这得到了支持数据库对象命名规则 http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements008.htm:
非引号标识符必须以数据库字符集中的字母字符开头。引用的标识符可以以任何开头
特点。
因此,Aqua Data Studio 似乎遵循将您提供的对象名称的大写版本括在双引号中的约定,这是其中一篇链接文章中提到的做法。
从你所展示的情况来看,select _id from ...
传递给 Oracle 作为select "_ID" from ...
,如果列名创建为"_ID"
。看来情况是这样的table1
, but table2
被创建为"_id"
- 因此大小写不匹配会生成您所看到的合法 ORA-00904。
您的客户端不会修改已用双引号引起来的列名,因此select "_id" from ...
按原样传递到 Oracle,并且可以正常工作table2
(但是,相反,会失败table1
).
如果名称不遵循不带引号的标识符的规则,并且如果它是按带引号创建的,则 Oracle 要求名称用双引号括起来 - 除非原始带引号的值无论如何都是有效的,即遵循不带引号的规则并以大写形式输入。由于列名以下划线开头,因此对于 Oracle 而言,无论大小写,所有对其的引用都必须用双引号引起来。如果您自己没有引用的话,您的客户只是在后台执行此操作。
遵循其他人给出的建议来避免使用带引号的标识符并始终使用有效的不带引号的名称可以避免此类问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)