ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第九节-SQL 语句中架构对象和部分的语法)

本文简述

此书下载方法:加入群技术交流群(免费)699712384,文件夹为ORACLE官方文档中 
CSDN技术网址 
简书技术网址 
ORACLE官网教程地址 
书名:

中文名:《SQL语言参考笔记》

英文名:《SQL Language Reference》

作者:二次猿

时间:阅读于2018年3月21日

准备工作:详情见:具体可以参考简书和二次猿公众号常用表

注意事项:跳过基本概念和非重要内容,重点举例说明,并且加粗,部分内容可能在其他章节会再次详细介绍,表格如果排版不美观,可以复制到excle进行直观展示,代码部分根据实际情况注释和说明



SQL 语句中架构对象和部分的语法

本节告诉您如何在 SQL 语句的上下文中引用架构对象及其部分。本节向您展示:

  • 引用对象的一般语法

  • Oracle 如何解析对对象的引用

  • 如何引用除您自己以外的架构中的对象

  • 如何引用远程数据库中的对象

  • 如何引用表和索引分区和子分区

下图显示了引用对象或部件的一般语法:

database_object_or_part::=

Description of database_object_or_part.gif follows
插图 "database_object_or_part" 的说明

(dblink::=)

地方:

  • object是对象的名称。

  • schema是包含该对象的架构。架构限定符允许您引用非您自己的架构中的对象。必须授予您在其他架构中引用对象的权限。如果省略schema, 则 Oracle 假定您引用的是您自己的架构中的对象。

    只有架构对象才能使用schema进行限定。使用列表项8显示架构对象。Nonschema 对象 (也显示为列表项8) 不能用schema限定, 因为它们不是架构对象。异常是公共同义词, 可以选择使用 "PUBLIC" 进行限定。引号是必需的。

  • part是对象的一部分。此标识符允许您引用架构对象的一部分, 如列或表的分区。并非所有类型的对象都有部件。

  • 只有在使用 Oracle 数据库分布式功能时, dblink才适用。这是包含该对象的数据库的名称。dblink限定符允许您引用除本地数据库以外的数据库中的对象。如果省略dblink, 则 Oracle 假定您引用的是本地数据库中的对象。并非所有 SQL 语句都允许访问远程数据库上的对象。

可以在分隔对对象的引用的各个阶段中包含空格, 但省略它们是常规的。

Oracle 数据库如何解析架构对象引用

当引用 sql 语句中的对象时, Oracle 将考虑 sql 语句的上下文, 并在相应的命名空间中查找该对象。找到对象后, Oracle 将执行由该对象上的语句指定的操作。如果在相应的命名空间中找不到命名对象, 则 Oracle 将返回一个错误。

下面的示例阐释 Oracle 如何解析 SQL 语句中对象的引用。考虑此语句, 将一行数据添加到由名称departments标识的表中:

INSERT INTO departments
  VALUES (280, 'ENTERTAINMENT_CLERK', 206, 1700);

根据语句的上下文, Oracle 确定departments可以是:

  • 您自己的架构中的表

  • 您自己的架构中的视图

  • 表或视图的专用同义词

  • 公共同义词

在考虑架构之外的命名空间之前, Oracle 总是尝试在自己的架构中解析命名空间中的对象引用。在此示例中, Oracle 尝试解析名称departments, 如下所示:

  1. 首先, Oracle 尝试在您自己的架构中查找包含表、视图和专用同义词的命名空间中的对象。如果对象是专用同义词, 则 Oracle 将定位该同义词所在的对象。此对象可以位于您自己的架构、其他架构或其他数据库中。该对象也可以是另一个同义词, 在这种情况下, Oracle 将定位该同义词所在的对象。

  2. 如果对象在命名空间中, 则 Oracle 将尝试对对象执行语句。在此示例中, Oracle 尝试将数据行添加到departments中。如果该对象不是语句的正确类型, 则 Oracle 将返回一个错误。在此示例中,departments必须是解析为表或视图的表、视图或专用同义词。如果departments是序列, 则 Oracle 将返回一个错误。

  3. 如果对象在迄今为止搜索的任何命名空间中都不存在, 则 Oracle 将搜索包含公共同义词的命名空间。如果该对象位于该命名空间中, 则 Oracle 将尝试对其执行该语句。如果该对象不是语句的正确类型, 则 Oracle 将返回一个错误。在此示例中, 如果departments是序列的公共同义词, 则 Oracle 将返回一个错误。

如果公共同义词具有任何从属表或用户定义的类型, 则不能在与从属对象相同的架构中创建与同义词同名的对象。

如果同义词没有任何从属表或用户定义的类型, 则可以在与从属对象相同的架构中创建同名的对象。Oracle 使任何从属对象无效, 并在下次访问时尝试重新验证它们。

另请参见:

Oracle 数据库 PL/sql 语言参考有关 PL/sql 如何解析标识符名称的信息

对其他架构中的对象的引用

若要引用其他架构中的对象, 请使用架构名称对对象名称进行前缀:

schema.object

例如, 此语句将删除示例架构hr中的employees:

DROP TABLE hr.employees;

对远程数据库中对象的引用

若要引用除本地数据库以外的数据库中的对象, 请按照对象名, 将数据库链接到该数据库的名称。数据库链接是一个架构对象, 它导致 Oracle 连接到远程数据库以访问那里的对象。本节告诉您:

  • 如何创建数据库链接

  • 如何在 SQL 语句中使用数据库链接

创建数据库链接

使用语句创建数据库链接创建数据库链接。该语句允许您指定有关数据库链接的信息:

  • 数据库链接的名称

  • 数据库连接字符串以访问远程数据库

  • 连接到远程数据库的用户名和密码

Oracle 将此信息存储在数据字典中。

数据库链接名称

创建数据库链接时, 必须指定其名称。数据库链接名称与其他类型对象的名称不同。它们可以长达128字节, 并且可以包含句点 (.) 和 "at" 符号 (@)。

给数据库链接的名称必须与数据库链接所引用的数据库的名称和数据库名称层次结构中数据库的位置相对应。下面的语法图显示了数据库链接名称的形式:

dblink::=

Description of dblink.gif follows
插图 "dblink" 的说明

地方:

  • database应指定数据库链接连接到的远程数据库的全局名称name部分。此全局名称存储在远程数据库的数据字典中。可以在GLOBAL_NAME数据字典视图中看到此名称。

  • domain应指定数据库链接连接到的远程数据库的全局名称的domain部分。如果从数据库链接的名称中省略domain , 则 Oracle 将数据库链接名称与本地数据库中当前存在于数据字典中的域限定在一起。

  • connection_qualifier允许您进一步限定数据库链接。使用连接限定符, 可以创建到同一数据库的多个数据库链接. 例如, 您可以使用连接限定符创建多个数据库链接, 以指向访问同一数据库的 Oracle 实际应用程序群集的不同实例。

    另请参见:

    Oracle 数据库管理员指南和 Oracle 数据库高级复制有关连接限定符的更多信息

组合database.domain有时称为服务名称.

另请参见:

Oracle 数据库网络服务管理员指南

用户名和密码

Oracle 使用用户名和密码连接到远程数据库。数据库链接的用户名和密码是可选的。

数据库连接字符串

数据库连接字符串是 Oracle Net 用于访问远程数据库的规范。有关编写数据库连接字符串的信息, 请参阅特定网络协议的 Oracle Net 文档。数据库链接的数据库连接字符串是可选的。

对数据库链接的引用

只有在使用 Oracle 分布式功能时, 数据库链接才可用。当您发出包含数据库链接的 SQL 语句时, 可以在下列表单中指定数据库链接名称:

  • 存储在数据字典中的完整数据库链接名称, 包括database、 domain和可选connection_qualifier组件。

  • partial数据库链接名称是database和可选connection_qualifier组件, 而不是domain组件。

Oracle 在连接到远程数据库之前执行这些任务:

  1. 如果语句中指定的数据库链接名称是部分的, 则 Oracle 将扩展名称以包含本地数据库的域, 如在数据字典中存储的全局数据库名称中所示。(您可以在GLOBAL_NAME数据字典视图中看到当前的全局数据库名称。

  2. Oracle 首先在您自己的架构中搜索与语句中的数据库链接同名的专用数据库链接。然后, 如果需要, 它将搜索具有相同名称的公用数据库链接。

    • Oracle 总是从第一个匹配的数据库链接 (私有或公共) 中确定用户名和密码。如果第一个匹配的数据库链接具有关联的用户名和密码, 则 Oracle 将使用它。如果它没有相关的用户名和密码, 则 Oracle 将使用您当前的用户名和密码。

    • 如果第一个匹配的数据库链接具有关联的数据库字符串, 则 Oracle 将使用它。否则, Oracle 将搜索下一个匹配 (公用) 数据库链接。如果找不到匹配的数据库链接, 或者没有匹配的链接有关联的数据库字符串, 则 Oracle 将返回一个错误。

  3. Oracle 使用数据库字符串访问远程数据库。访问远程数据库后, 如果GLOBAL_NAMES参数的值为true, 则 Oracle 将验证database.domain数据库链接名称的域部分是否与远程数据库。如果此条件为 true, 则 Oracle 将使用步骤2中选择的用户名和密码进行连接。否则, Oracle 将返回一个错误。

  4. 如果使用数据库字符串、用户名和密码的连接成功, 则 Oracle 将尝试使用解析对象引用的规则和引用其他架构中的对象来访问远程数据库中的指定对象。在本节前面。

通过设置为FALSE初始化参数GLOBAL_NAMES , 可以禁用数据库链接名称的database.domain部分必须与远程数据库的完整全局名称匹配的要求。ALTER SYSTEMALTERSESSION语句的GLOBAL_NAMES参数。

另请参见:

Oracle 数据库管理员指南有关远程名称解析的详细信息

对分区表和索引的引用

可以对表和索引进行分区。当分区时, 这些架构对象由许多名为分区的部分组成, 它们都具有相同的逻辑属性。例如, 表中的所有分区共享相同的列和约束定义, 索引中的所有分区共享相同的索引列。

分区扩展名称和分区扩展名允许您执行某些分区级别和分区级操作, 例如, 仅在一个分区或分区中删除分区或分区中的所有行。如果没有扩展名, 此类操作将要求您指定谓词 (WHERE子句)。对于范围和列表分区表, 尝试使用谓词对分区级操作进行短语处理可能会很麻烦, 特别是当 range 分区键使用多个列时。对于哈希分区和子分区, 使用谓词仍然比较困难, 因为这些分区和子分区基于系统定义的哈希函数。

分区扩展名称使您可以像表一样使用分区。此方法的优点对于范围分区表最有用, 即您可以通过向其他用户或角色授予 (或撤消) 对这些视图的权限来构建分区级访问控制机制。若要将分区用作表, 请通过从单个分区中选择数据来创建视图, 然后将该视图用作表。

语法可以在任何 SQL 语句中指定分区扩展或分区扩展表名, 其中partition_extended_namesubpartition_extended_name元素出现在语法中。

partition_extended_name::=

Description of partition_extended_name.gif follows
插图 "partition_extended_name" 的说明

subpartition_extended_name::=

Description of subpartition_extended_name.gif follows
插图 "subpartition_extended_name" 的说明

DML 语句INSERT、 UPDATEDELETE,ANALYZE语句要求在分区或分区名称周围加括号。此小的区别反映在partition_extension_clause:

partition_extension_clause::=

Description of partition_extension_clause.gif follows
插图 "partition_extension_clause" 的说明

partition_extended_name、 subpartition_extended_namepartition_extension_clause中,PARTITIONFORSUBPARTITION,FOR子句允许您在不使用其名称的情况下引用分区。它们对任何类型的分区都有效, 对于间隔分区尤其有用。在将数据插入表中时, 根据需要自动创建间隔分区。

对于相应的partition_key_valuesubpartition_key_value, 请为每个分区键列指定一个值。对于列的分区键, 请为每个分区键指定一个值。对于复合分区, 为每个分区键指定一个值, 后跟每个 subpartitioning 键的一个值。所有分区键值都以逗号分隔。对于间隔分区, 只能指定一个partition_key_value, 并且它必须是有效的NUMBER或日期时间值。SQL 语句将在包含指定值的分区或子分区上进行操作。

另请参见:

CREATETABLE "间隔子句"有关间隔分区的详细信息

对扩展名称的限制目前, 使用分区扩展和分区扩展表名有以下限制:

  • 没有远程表: 分区扩展或分区扩展表名不能包含数据库链接 (dblink) 或同义词, 它转换为具有 dblink 的表。要使用远程分区和子分区, 请在远程站点上创建一个使用扩展表名称语法的视图, 然后引用远程视图。

  • 无同义词: 必须使用基表指定分区或分区扩展。不能使用同义词、视图或任何其他对象。

  • 子句的PARTITION FORSUBPARTITIONFOR视图的 DDL 操作无效。

  • 在子句的PARTITION FORSUBPARTITION中, 不能指定关键字FOR DEFAULTMAXVALUEpartition_key_value或的 bind 变量. subpartition_key_value.

  • PARTITIONSUBPARTITION子句中, 不能为分区或分区名称指定绑定变量。

例子在下面的语句中,sales是分区sales_q1_2000的分区表。可以创建单个分区sales_q1_2000的视图, 然后将其用作表。本示例从分区中删除行。

CREATE VIEW Q1_2000_sales AS
  SELECT *
    FROM sales PARTITION (SALES_Q1_2000);

DELETE FROM Q1_2000_sales
  WHERE amount_sold < 0; 

对对象类型属性和方法的引用

若要引用 SQL 语句中的对象类型属性或方法, 必须用表别名完全限定引用。请从示例架构oe中考虑下面的示例, 其中包含类型cust_address_typ和表customers, 并基于cust_address_typcust_address:

CREATE TYPE cust_address_typ
  OID '82A4AF6A4CD1656DE034080020E0EE3D'
  AS OBJECT
    (street_address    VARCHAR2(40),
     postal_code       VARCHAR2(10),
     city              VARCHAR2(30),
     state_province    VARCHAR2(10),
     country_id        CHAR(2));
/
CREATE TABLE customers
  (customer_id        NUMBER(6),
   cust_first_name    VARCHAR2(20) CONSTRAINT cust_fname_nn NOT NULL,
   cust_last_name     VARCHAR2(20) CONSTRAINT cust_lname_nn NOT NULL,
   cust_address       cust_address_typ,
. . .

在 SQL 语句中, 必须使用表别名完全限定对postal_code特性的引用, 如下面的示例所示:

SELECT c.cust_address.postal_code
  FROM customers c;

UPDATE customers c
  SET c.cust_address.postal_code = '14621-2604'
  WHERE c.cust_address.city = 'Rochester'
    AND c.cust_address.state_province = 'NY';

若要引用不接受参数的成员方法, 必须提供空括号。例如, 示例架构oe包含一个对象表categories_tab, 它基于catalog_typ, 其中包含成员函数getCatalogName为了在 SQL 语句中调用此方法, 必须提供空括号, 如本示例所示:

SELECT TREAT(VALUE(c) AS catalog_typ).getCatalogName() "Catalog Type"
  FROM categories_tab c
  WHERE category_id = 90;

Catalog Type
------------------------------------
online catalog

猜你喜欢

转载自blog.csdn.net/huyingzuo/article/details/80334886