【问题标题】:Oracle SELECT - Double quotes or no double quotes? [duplicate]Oracle SELECT - 双引号或没有双引号? [复制]
【发布时间】:2013-07-02 13:22:23
【问题描述】:

全部,

在为 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

有谁知道这里发生了什么,为什么会出现这种情况,以及导致这种情况的表之间的主要区别是什么?

谢谢

【问题讨论】:

标签: database oracle select plsql


【解决方案1】:

问题来自对象的创建。

如果您创建一个带有小写和引号的对象,它将强制区分大小写。

所以你需要使用引号和正确的大小写来使用它。

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

【讨论】:

    【解决方案2】:

    关于大小写的答案和链接是正确的,但您的情况有点超出了简单的大小写问题,因为您的列名以下划线开头,而且您的客户显然通常对您隐藏引用。

    如果您尝试使用名为 _id 的列创建表,但不引用它,那么您会收到“ORA-00911:无效字符”错误,其原因文本显示“标识符可能不以除字母和数字外的任何 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 工作正常(但相反,对于 @987654332 会失败@)。

    Oracle 要求名称用双引号括起来,如果它不遵循不带引号的标识符的规则,并且如果它被创建为带引号的 - 除非原始带引号的值仍然有效,即遵循不带引号的规则并被输入大写。由于您的列名以下划线开头,就 Oracle 而言,无论大小写如何,对它的所有引用都必须用双引号引起来。如果您自己没有引用,您的客户只是在后台执行此操作。

    按照其他人给出的建议避免使用带引号的标识符并始终使用有效的不带引号的名称将避免此类问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 2012-10-16
      • 1970-01-01
      • 2013-07-12
      • 2022-11-17
      • 2011-10-25
      • 2021-12-09
      • 2011-06-19
      相关资源
      最近更新 更多