Oracle SELECT - 双引号还是没有双引号?

时间:2013-07-04 13:45:54

标签: database oracle select plsql

所有

为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

有谁知道这里发生了什么,为什么会出现这种情况,这些表之间的关键差异是什么导致这种情况?

由于

2 个答案:

答案 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)

问题来自于对象的创建。

如果使用小写和引号创建对象,则会强制区分大小写。

所以你需要使用引号和右边框来使用它。

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