Oracle 为什么我必须使用双引号连接两个表?
我有两个表,我不明白为什么我需要用双引号“”连接它们。这是在ORACLE 12c中运行的 有人能给我解释一下吗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),
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权限。然后,该“另一个”用户必须在该表名称之前加上其所有者名称。否则,这将不起作用(除了向公众授予特权,但这很可能不是一个好主意)。格兰特与双引号无关。