使用常规表时,可以使用以下Oracle SQL查询:
SELECT max(some_primary_key) FROM MyTable
但是,在使用数据库对象(即对象表)时,会产生以下错误:
ORA-00904: "SOME_PRIMARY_KEY": invalid identifier
引用列名时,如下所示:
SELECT max("some_primary_key") FROM MyTable
这有点像预期的那样。 为什么在使用Objects时需要转义列名,而不是使用表?
答案 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
答案 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版本是什么?