【问题标题】:Create view in ORACLE在 ORACLE 中创建视图
【发布时间】:2019-01-15 09:50:00
【问题描述】:

以下两种说法有什么不同吗 声明一:

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;

第二条语句没有双引号。我想知道有什么区别,Oracle 没有抱怨它编译了这两个代码。

【问题讨论】:

  • 两者相同。不知何故,它用于根据需要保持区分大小写。
  • 将列名包含在双引号内将抵消单引号或任何特殊字符的预期行为。由于您的代码中没有特殊字符。不会有问题
  • 在你的例子中是一样的,但是仅供参考,当你在 oracle 中创建任何对象时使用引号,它变得区分大小写

标签: sql oracle quoted-identifier


【解决方案1】:

它们在您的示例中完全相同。 From the documentation:

每个数据库对象都有一个名称。在 SQL 语句中,您可以用带引号的标识符不带引号的标识符来表示对象的名称。

  • 带引号的标识符以双引号 (") 开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。

  • 未加引号的标识符没有被任何标点符号包围。

您可以使用带引号或不带引号的标识符来命名任何数据库对象。 ...

不带引号的标识符不区分大小写。 Oracle 将它们解释为大写。带引号的标识符区分大小写。

所以,ORDER_NO 不带引号,也不区分大小写,并且 Oracle 将名称视为大写 - 如此有效,当它在数据字典中查找匹配的列名称时(在 all_tab_columns 视图中),它查找确切的字符串值'ORDER_NO'。如果您未引用 order_noOrder_No 或任何其他大小写组合,情况也会如此;因为它没有被引用 Oracle 仍然将其视为大写,并在内部查找 'ORDER_NO'

"ORDER_NO" 被引用,因此区分大小写,但无论如何它都是大写的,所以没有区别。 Oracle 仍在数据字典中寻找名为'ORDER_NO' 的列。

如果实际的对象标识符(例如列名)在数据字典中是大写的,那么无论您在任何情况下将其作为非带引号的标识符还是作为大写的带引号的标识符提供都没有关系。

不能做的是使用引号和不同的大小写。 "ORDER_NO" 很好; "order_no""Order_No" 或任何其他引用混合大小写将与数据字典中的内容不匹配。

虽然您可以使用非大写的带引号的标识符创建对象(或包含或以其他非法字符开头,如该文档中列出的规则所示),但通常认为这是一个坏主意,因为您然后 总是 必须使用引号和完全相同的大小写。正如文档还指出的那样:

Oracle 不建议对数据库对象名称使用带引号的标识符。这些带引号的标识符被 SQL*Plus 接受,但在使用其他管理数据库对象的工具时它们可能无效。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多