全,
在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段使用引号,而其他表则不这样做。
我最近遇到的一个例子:
在Aqua Data Studio的Query Analyzer窗口中,我尝试从两个不同的表中选择相同的字段:
select _id from table1
select _id from table2table1和table2有很大的不同,但是只有table1执行这个select语句时没有错误。当我尝试为table2执行这条语句时,我得到了以下结果:
ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 但是,当我像这样执行第二条语句时,它可以完美地工作:
select "_id" from table2有没有人知道这里发生了什么,为什么会这样,表之间的关键差异是什么?
谢谢
发布于 2013-07-04 23:16:47
关于大小写的答案和链接是正确的,但您的情况超出了简单的大小写问题,这既是因为您的列名以下划线开头,也是因为您的客户显然通常对您隐藏了引用。
如果您尝试创建一个包含名为_id的列的表,但没有将其引起来,则会得到一个'ORA-00911: invalid character‘错误,其原因文本显示’标识符不能以字母和数字以外的任何ASCII码字符开头‘;这实际上也是错误的,因为它也不能以数字开头(例如,0_id给出了'ORA-00904::invalid identifier')。这是由database object naming rules备份的
非引号标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。
因此,看起来Aqua Data Studio遵循了一种惯例,即用双引号将您提供的对象名称的大写版本括起来,这一做法在其中一个链接的帖子中提到。
如您所示,select _id from ...将作为select "_ID" from ...传递给Oracle,如果列名被创建为"_ID",这是可以接受的。看起来这就是table1的情况,但是table2是作为"_id"创建的-所以大小写不匹配会生成您看到的合法ORA-00904。
您的客户机不会修改已经包含在双引号中的列名,因此select "_id" from ...会按原样传递到Oracle,并且可以在table2上正常工作(但反过来,在table1上就会失败)。
如果名称不遵循未加引号的标识符的规则,并且它是用引号创建的,Oracle要求名称用双引号括起来-除非原始的引号值无论如何都是有效的,即遵循未加引号的规则并以大写输入。由于您的列名以下划线开头,因此对于Oracle而言,无论大小写如何,对它的所有引用都必须用双引号括起来。如果你自己没有引用的话,你的客户只是在幕后这么做。
遵循其他人的建议,避免使用带引号的标识符,并始终使用有效的未带引号的名称,可以避免类似的问题。
发布于 2013-07-04 21:49:23
问题来自于对象的创建。
如果您创建了一个带有小写和引号的对象,它将强制区分大小写。
所以你需要使用引号和大小写来使用它。
如果创建时不带引号(或全部大写),则不会遇到任何“区分大小写”的问题,并且可以选择小写或大写的对象(不带引号)
https://stackoverflow.com/questions/17471948
复制相似问题