Oracle 12c中连接表为何需使用双引号?求技术解析
为什么在Oracle 12c中连接这两张表必须用双引号?
这问题本质是Oracle对数据库对象标识符(表名、列名、Schema名)的大小写敏感规则在搞事情,结合你的建表语句我给你掰扯清楚:
1. Oracle的默认标识符规则
平时咱们建表如果不用双引号,比如写CREATE TABLE TB1.PROPERTY,Oracle会自动把所有标识符(TB1、PROPERTY、还有列名)转换成大写存储到数据字典里。后续引用的时候,不管你写tb1.property还是TB1.PROPERTY,Oracle都会统一转成大写去匹配,完全不用纠结大小写。
2. 你的建表语句触发了大小写敏感模式
但你看自己的建表语句:
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(...) );
所有的Schema名、表名、列名甚至主键约束名,你都用双引号""包裹了。这时候Oracle就会严格保留你写的大小写格式存储这些标识符——比如"ItemID"就是驼峰式的,不会转成大写ITEMID;"Name"就是首字母大写的,不是NAME。
3. 为什么连接时必须用双引号?
当你尝试连接这两张表时,如果不用双引号,比如写:
SELECT * FROM TB1.PROPERTY p JOIN TB2.CATALOGITEM c ON p.ItemID = c.ID;
Oracle会自动把ItemID转成ITEMID、ID转成ID?不对,是把所有未加双引号的标识符转成大写,所以p.ItemID会被解析成P.ITEMID,但你的实际列名是"ItemID"(驼峰),数据字典里根本找不到ITEMID这个列,自然会报“无效标识符”的错误。
只有用双引号包裹这些标识符,Oracle才会按照你定义的大小写去精准匹配:
SELECT * FROM "TB1"."PROPERTY" p JOIN "TB2"."CATALOGITEM" c ON p."ItemID" = c."ID";
小建议
如果不想每次引用都写双引号,后续建表时可以去掉所有双引号,Oracle会自动统一转成大写存储,引用时随便写大小写都能正常匹配,省心很多。
内容的提问来源于stack exchange,提问作者Adam M
相关产品推荐
相关产品推荐

