繁体   English   中英

Oracle DB 引用列名称

[英]Oracle DB quote column names

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

SELECT max(some_primary_key) FROM MyTable

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

ORA-00904: "SOME_PRIMARY_KEY": invalid identifier

引用列名时,如下所示:

SELECT max("some_primary_key") FROM MyTable

这像预期的那样工作。 为什么在使用对象而不是表时需要转义列名?

它与对象或表无关,它与这些对象/表的创建方式有关。

如果你确实create table "blabla" ,那么你总是需要用“blabla”来寻址这个表,如果你确实create table blabla ,那么你可以通过 BLABLA 或 blabla 或 bLabLa 来寻址这个表。 使用" "使名称区分大小写,这就是大多数开发人员不使用" "的原因,因为通常您不想要区分大小写的名称。

数据库 Object 命名规则

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

  • 带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构 object,则在引用该 object 时必须使用双引号。
  • 不带引号的标识符不被任何标点符号包围。

您可以使用带引号或不带引号的标识符来命名任何数据库 object。 但是,数据库名称、全局数据库名称和数据库链接名称始终不区分大小写,并以大写形式存储。 如果您将此类名称指定为带引号的标识符,则引号将被静默忽略。 有关命名用户和密码的其他规则,请参阅 CREATE USER。

总结一下

当你这样做时:

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 数据库 Object 名称和限定词

[TL;DR] 最简单的做法是永远不要在 object 名称周围使用双引号,而让 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";

都会给出相同的 output 和:

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 已区分大小写。)

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

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;
/

---创建了我的 object 的表

CREATE TABLE MYTABLE OF MYTYPE ;

---发表声明。

SELECT max(some_property) FROM MYTABLE;

没有引号对我来说工作正常。 不知道为什么它不适用于您的情况。 你的 oracle 版本是多少?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM