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

Oracle 为什么我必须使用双引号连接两个表?,oracle,Oracle,我有两个表,我不明白为什么我需要用双引号“”连接它们。这是在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),

我有两个表,我不明白为什么我需要用双引号“”连接它们。这是在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”。“项目ID”:无效标识符 90400000-%s:无效标识符 *原因:
*操作:第8行第8列出错

一个常见的错误是,源代码不是Oracle的人会这样做:使用大小写混合,并将表名和列名用双引号括起来。你能做到这一点并不意味着你应该做到。没有好处,有很多缺点

无论何时引用此类表或列,都必须将其名称括在双引号中,并正确键入其名称,即不要键入错误。例如,“FirstName”将不同于“FirstName”或“FirstName”

很快-去掉双引号。不管你想怎么输入这些名字,你都不必注意。Oracle将以大写形式将这些名称存储到数据字典中,但您可以根据需要引用它,而无需使用双引号(firstname、firstname、firstname-所有这些都是一样的)

由于错误的原因,这些表属于不同的用户,因此您必须从一个用户获得对另一个用户的授权(至少是SELECT),才能使其正常工作

(这并不重要,但是-那些CREATETABLE语句是无效的,它们都错过了最后一个右括号)

示范:

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.
回到迈克身边:

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>

属性和CATALOGITEM表属于两种不同的模式TB1和TB2。SQL中缺少这些架构限定符。请不要使用带引号的混合大小写标识符。它从来没有帮助…很好地抓住了ArtBajji,我只是模拟了那些表脚本作为一个简单的例子,它们实际上在模式中。有人能解释一下这个问题是如何被提升的吗?好的,我想我明白了。这些表是用双引号“”创建的,因此需要以这种方式引用它们。这是一个第三方应用程序,我无法控制设计本身。我对你正在做的资源调配有点困惑??赋予用户不同的权限将允许引用不带双引号的表?您创建了两个表。其中一个属于用户TB1,另一个属于用户TB2。如果要运行查询,其中一个用户必须向另一个用户授予(至少)SELECT权限。然后,该“另一个”用户必须在该表名称之前加上其所有者名称。否则,这将不起作用(除了向公众授予特权,但这很可能不是一个好主意)。格兰特与双引号无关。