Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle SELECT-双引号还是无双引号?_Database_Oracle_Select_Plsql - Fatal编程技术网

Database Oracle SELECT-双引号还是无双引号?

Database Oracle SELECT-双引号还是无双引号?,database,oracle,select,plsql,Database,Oracle,Select,Plsql,全部, 在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段应用引号,而其他表则不这样做 我最近遇到的一个例子是: 在Aqua Data Studio的查询分析器窗口中,我尝试从两个不同的表中选择相同的字段: select _id from table1 select _id from table2 表1和表2差别很大,但只有表1执行此select语句时没有错误。当我尝试为表2执行此语句时,我得到以下结果: ORA-00904: "_

全部,

在为Oracle 11i数据库编写SELECT查询时,为什么Oracle中的某些表强制对所选字段应用引号,而其他表则不这样做

我最近遇到的一个例子是:

在Aqua Data Studio的查询分析器窗口中,我尝试从两个不同的表中选择相同的字段:

    select _id from table1
    select _id from table2
表1和表2差别很大,但只有表1执行此select语句时没有错误。当我尝试为表2执行此语句时,我得到以下结果:

ORA-00904: "_ID": invalid identifier
Script line 1, statement line 1, column 7 
但是,当我像这样执行第二条语句时,它工作得非常好:

    select "_id" from table2
有谁知道这里发生了什么,为什么会这样,以及导致这种情况的表之间的关键区别是什么


谢谢

问题来自对象的创建

如果使用小写和引号创建对象,它将强制区分大小写

因此,您需要使用引号和正确的大小写来使用它


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

有关大小写的答案和链接是正确的,但您的情况稍微超出了简单的大小写问题,这既因为列名以下划线开头,也因为客户机通常会对您隐藏引用

如果您试图创建一个包含名为
\u id
的列的表,而不引用该列,则会出现“ORA-00911:invalid character”错误,其原因文本表示“标识符不能以字母和数字以外的任何ASCII字符开头”;这实际上也是错误的,因为它也不能以数字开头(例如,
0\u id
给出“ORA-00904::无效标识符”)。这一点得到以下方面的支持:

非引号标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任意字符开头 性格

因此,Aqua DataStudio似乎遵循一种惯例,将您提供的对象名称的大写版本括在双引号中,这是一种在其中一篇链接文章中提到的做法

从您所显示的内容来看,
select\u id From…
作为
select“\u id”From…
”传递给Oracle,如果列名被创建为
“\u id”
,则这很好。表1的情况似乎是这样的,但是表2的情况是作为
“\u id”
”创建的,因此这种情况不匹配会生成您看到的合法ORA-00904

您的客户端没有修改已包含在双引号中的列名,因此,
select“\u id”from…
将按原样传递给Oracle,并对
table2
正常工作(但反过来,对
table1
则会失败)

如果名称不符合无引号标识符的规则,并且如果名称是按引号创建的,则Oracle要求名称用双引号括起来,除非原始的引号值仍然有效,即遵循无引号规则并以大写字母输入。因为列名以下划线开头,所以对于Oracle而言,所有对它的引用都必须用双引号括起来,而不管大小写如何。如果你自己没有引用,你的客户只是在后台这样做


遵循其他人给出的建议,避免使用带引号的标识符,并始终使用有效的无引号名称,这样可以避免类似问题。

请参阅我对另一个问题的回答: