Oracle DB引用列名

时间:2016-07-12 11:53:18

标签: sql oracle

使用常规表时,可以使用以下Oracle SQL查询:

SELECT max(some_primary_key) FROM MyTable

但是,在使用数据库对象(即对象表)时,会产生以下错误:

ORA-00904: "SOME_PRIMARY_KEY": invalid identifier

引用列名时,如下所示:

SELECT max("some_primary_key") FROM MyTable

这有点像预期的那样。 为什么在使用Objects时需要转义列名,而不是使用表?

4 个答案:

答案 0 :(得分:2)

它与对象或表没有关系,它与如何创建这些对象/表有关。

如果你这样做 create table "blabla"然后你总是需要用" blabla"来表达这个表,如果你create table blabla那么你可以通过BLABLA或blabla或bLabLa来解决这个表。使用" "会使名称区分大小写,这也是大多数开发人员不使用" "的原因,因为通常您不需要区分大小写的名称。

答案 1 :(得分:2)

[TL; DR]最简单的做法是永远不要在对象名称周围使用双引号,只让oracle以默认方式管理区分大小写。

默认情况下,Oracle数据库区分大小写;但是,默认情况下,它们还会将所有内容转换为大写字母,以便从用户那里抽象出区分大小写。

CREATE TABLE Test ( column_name NUMBER );

然后:

SELECT COUNT(column_name) FROM test;
SELECT COUNT(Column_Name) FROM Test;
SELECT COUNT(COLUMN_NAME) FROM TEST;
SELECT COUNT(CoLuMn_NaMe) FROM tEsT;
SELECT COUNT("COLUMN_NAME") FROM "TEST";

所有人都会给出相同的输出并且:

DESCRIBE test;

输出:

Name        Null Type
----------- ---- ------
COLUMN_NAME      NUMBER

(注意:Oracle的默认行为是将名称转换为大写。)

如果您使用双引号,那么oracle将尊重您在对象名称中使用大小写的情况(然后您需要始终使用相同的大小写):

CREATE TABLE "tEsT" ( "CoLuMn_NaMe" NUMBER );

(注意:表和列名称都用双引号括起来,现在要求您在引用时使用完全相同的大小写和引号。)

然后你只能做(因为你需要尊重区分大小写):

SELECT COUNT("CoLuMn_NaMe") FROM "tEsT";

DESCRIBE "tEsT";

输出:

Name        Null Type
----------- ---- ------
CoLuMn_NaMe      NUMBER

(注意:Oracle尊重区分大小写。)

答案 2 :(得分:2)

  

数据库对象命名规则

  

每个数据库对象都有一个名称。在SQL语句中,您表示   带引号标识符或非引用标识符的对象的名称   标识符

     
      
  • 带引号的标识符以双引号(")开头和结尾。如果使用带引号的标识符命名模式对象,那么您   每次引用该对象时都必须使用双引号。
  •   
  • 未加引号的标识符不会被任何标点符号包围。
  •   
     

您可以使用带引号或非带引号的标识符来命名   数据库对象。但是,数据库名称,全局数据库名称和   数据库链接名称始终不区分大小写,并存储为   大写。如果你指定这样的名称作为带引号的标识符,那么   引号被默默忽略。请参阅创建用户   命名用户和密码的附加规则。

总结一下

当你这样做时:

SELECT max(some_primary_key) FROM MyTable

Oracle假设您的列声明如下:

CREATE TABLE MyTable (
    some_primary_key INT,
    ...
)

查看结果错误,情况并非如此。你显然是这样说的:

CREATE TABLE MyTable (
    "some_primary_key" INT,
    ...
)

因此,您应该始终使用双引号和正确的大小写来引用该列,因此:

SELECT max("some_primary_key") FROM MyTable

圣经:Oracle Database Object Names and Qualifiers

答案 3 :(得分:1)

我在Oracle 11g中创建了一个对象:

CREATE OR REPLACE TYPE MyType AS OBJECT (
   some_property NUMBER(20),
  CONSTRUCTOR FUNCTION MyType(some_property number default 123) RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY MyType AS
  CONSTRUCTOR FUNCTION MyType(some_property number default 123)
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.some_property := some_property;
    RETURN;
  END;
END;
/

---创建了一个我的对象表

CREATE TABLE MYTABLE OF MYTYPE ;

---发表声明。

SELECT max(some_property) FROM MYTABLE;

对我没有引号的工作正常。不知道为什么它不适合你的情况。你的oracle版本是什么?