我有2个表,我不明白为什么我需要使用双引号“”加入它们。这是在ORACLE 12c中运行的......
有人可以向我解释一下吗?
CREATE TABLE "TB1"."PROPERTY"
( "ItemID" CHAR(36 BYTE) NOT NULL ENABLE,
"Name" NVARCHAR2(255) NOT NULL ENABLE,
"Type" NVARCHAR2(50),
"Value" NCLOB,
"Size" NUMBER(*,0),
CONSTRAINT "COMPOUNDPK" PRIMARY KEY ("ItemID", "Name")
CREATE TABLE "TB2"."CATALOGITEM"
( "ID" CHAR(36 BYTE) NOT NULL ENABLE,
"Type" NUMBER(*,0),
"Shortcut" CHAR(1 BYTE),
"Name" NVARCHAR2(255),
PRIMARY KEY ("ID")
SELECT *
FROM CATALOGITEM c, PROPERTY p
WHERE p."ItemID" = c."ID"
我收到以下错误:
ORA-00904:“P”。“ITEMID”:标识符无效 00904. 00000 - “%s:无效标识符” *原因:
*动作:行错误:8列:8
答案 0 :(得分:2)
一个常见的错误人 - 他们的起源不是Oracle - 做:使用混合大小写并附上表&列名称为双引号。您可以这样做的事实并不意味着您应该这样做。没有好处,有许多缺点。
无论何时引用此类表或列,都必须将其名称括在双引号中并正确键入其名称,即不要错误输入。例如,“FirstName”与“Firstname”或“FIRSTNAME”不同。
很快 - 摆脱双引号。无论如何键入这些名称 - 您不必注意它。 Oracle会将这些名称在UPPERCASE中存储到数据字典中,但您无论如何都可以引用它 - 不使用双引号(firstname,FirstName,FIRSTNAME - 都是相同的)。
由于错误原因 - 这些表属于不同的用户,因此您必须从一个用户获取授权(至少为SELECT)才能使其正常工作。
(这并不重要,但是 - 那些CREATE TABLE语句无效,都错过了最后的关闭括号。)
示范:
SQL> show user
USER is "SCOTT"
SQL> CREATE TABLE scott."PROPERTY"
2 ( "ItemID" CHAR(36 BYTE) NOT NULL ENABLE,
3 "Name" NVARCHAR2(255) NOT NULL ENABLE,
4 "Type" NVARCHAR2(50),
5 "Value" NCLOB,
6 "Size" NUMBER(*,0),
7 CONSTRAINT "COMPOUNDPK" PRIMARY KEY ("ItemID", "Name"));
Table created.
以用户MIKE身份连接并创建另一个表:
SQL> connect mike/lion@xe
Connected.
Session altered.
SQL> CREATE TABLE mike."CATALOGITEM"
2 ( "ID" CHAR(36 BYTE) NOT NULL ENABLE,
3 "Type" NUMBER(*,0),
4 "Shortcut" CHAR(1 BYTE),
5 "Name" NVARCHAR2(255),
6 PRIMARY KEY ("ID"));
Table created.
SQL> select *
2 from catalogitem c, property p
3 where p."ItemID" = c."ID";
from catalogitem c, property p
*
ERROR at line 2:
ORA-00942: table or view does not exist
正如所料,这不起作用。现在,回到SCOTT并为MIKE授予一些权限:
SQL> connect scott/tiger@xe
Connected.
Session altered.
SQL> grant select on property to mike;
Grant succeeded.
回到MIKE:
SQL> connect mike/lion@xe
Connected.
Session altered.
SQL> select *
2 from catalogitem c, scott.property p --> note SCOTT here!
3 where p."ItemID" = c."ID";
no rows selected
SQL>