为什么我必须使用双引号来连接2个表?

时间:2018-03-30 18:18:22

标签: oracle

我有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

1 个答案:

答案 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>