以下两个陈述之间有什么不同吗陈述一:
CREATE OR REPLACE VIEW ABC AS
SELECT "ORDER_NO","OBJKEY"
FROM TEST_TABLE;
声明二:
CREATE OR REPLACE VIEW ABC AS
SELECT ORDER_NO,OBJKEY
FROM TEST_TABLE;
第二个语句没有双引号。我想知道有什么区别,甲骨文没有抱怨它确实编译了这两个代码。
以下两个陈述之间有什么不同吗陈述一:
CREATE OR REPLACE VIEW ABC AS
SELECT "ORDER_NO","OBJKEY"
FROM TEST_TABLE;
声明二:
CREATE OR REPLACE VIEW ABC AS
SELECT ORDER_NO,OBJKEY
FROM TEST_TABLE;
第二个语句没有双引号。我想知道有什么区别,甲骨文没有抱怨它确实编译了这两个代码。
它们在您的示例中完全相同。从文档中:
每个数据库对象都有一个名称。在 SQL 语句中,您用带引号的标识符或不带引号的标识符来表示对象的名称。
带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
不带引号的标识符不被任何标点符号包围。
您可以使用带引号或不带引号的标识符来命名任何数据库对象。...
和
不带引号的标识符不区分大小写。Oracle 将它们解释为大写。带引号的标识符区分大小写。
因此,ORDER_NO
不带引号,也不区分大小写,并且 Oracle 将名称视为大写 - 因此,当它在数据字典中查找匹配的列名称(在all_tab_columns
视图中)时,它会查找确切的字符串值'ORDER_NO'
。如果您有未引用的order_no
或Order_No
任何其他混合案例,情况也是如此;因为它是未引用的 Oracle 仍然将其视为大写,并在内部查找'ORDER_NO'
.
"ORDER_NO"
被引用,所以它是区分大小写的,但因为它是大写的,所以没有区别。Oracle 仍在数据字典中寻找名为'ORDER_NO'
.
如果实际的对象标识符(例如列名)在数据字典中是大写的,那么无论您在任何情况下将其作为非带引号的标识符还是作为大写的带引号的标识符提供都没有关系。
你不能做的是使用引号和不同的大小写。"ORDER_NO"
很好;"order_no"
or"Order_No"
或任何其他引用的混合大小写将与数据字典中的内容不匹配。
虽然您可以使用非大写的引号标识符创建对象(或包含或以其他非法字符开头,如该文档中列出的规则所示),但通常认为这是一个坏主意,因为您总是必须使用引号和完全相同的情况。正如文档还指出的那样:
Oracle 不建议对数据库对象名称使用带引号的标识符。SQL*Plus 接受这些带引号的标识符,但在使用其他管理数据库对象的工具时它们可能无效。