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