金仓数据库 KingbaseES SQL 语言参考手册 (3.10. 数据库对象引用方式)

3.10. 数据库对象引用方式

KingbaseES 数据库支持在 SQL 语句的上下文中引用 Schema 对象。 KingbaseES 数据库当前版本支持如下引用类型:

  • 引用 Schema 对象

  • 引用分区表和索引

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

引用的一般语法如下: [ schema. ] object [ .part ]

其中:

object 是指对象的名称。

schema 是包含对象的 Schema。此限定符允许用户在被授予权限后引用其他 Schema 的对象。如果省略,则默认为用户默认 Schema 中的对象。

schema 只适用于 Schema 对象,例如表(Table)、视图(View)、索引(Index)、分区(Partition)、序列(Sequence)、同义词(Synonyms)、触发器 (Trigger)、自定义函数、存储过程、包和触发器等。

非 Schema 对象不能使用,例如用户(User)、角色(Role)、表空间(Tablespace)和目录(Directory)。但公有同义词除外,它可以选择使用“ PUBLIC ”进行限定,必须带有引号。

part 是对象的一部分。此标识符让用户可以引用 Schema 对象的一部分,例如表的列或分区。但并不适用于所有类型的对象。

当在 SQL 语句中引用对象时,KingbaseES 数据库会考虑 SQL 语句的上下文并在命名空间中找到该对象,然后执行对该对象的指定操作。 如果在命名空间中找不到命名对象, 则返回错误。

3.10.1. 引用 Schema 对象

当在 SQL 语句中引用对象时,KingbaseES 数据库会考虑 SQL 语句的上下文并在命名空间中找到该对象,然后执行对该对象的指定操作。如果在命名空间中找不到命名对象, 则返回错误。

以下示例说明 KingbaseES 如何解析SQL语句中对象的引用。如下语句,将一行数据添加到departments表中:

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

根据SQL语句的上下文,departments 在数据库中可能是如下情况:

  • 一张在默认 Schema 中的表

  • 一个在默认 Schema 中的视图

  • 一个表或视图的私有同义词

  • 一个公有同义词

KingbaseES 数据库会先尝试在默认的 Schema 中的命名空间里解析被引用对象,然后再考虑该Schema 之外的命名空间。

在此示例中,KingbaseES 数据库的解析流程如下:

  1. KingbaseES 数据库首先尝试在默认的 Schema 的名称空间里去定位对象。如果对象是私有同义词,则 KingbaseES 数据库会找到该同义词所代表的对象。

该对象可以在默认的Schema中,也可以在其他Schema中或者在另一个数据库中。该对象也可以是其他的同义词,在这种情况下,KingbaseES 数据库会找到同义词所代表的对象。

  1. 如果对象在命名空间中被找到,则KingbaseES数据库尝试执行该SQL语句。

在此示例中,KingbaseES 数据库尝试将一行数据添加到 departments 中。如果此对象的类型不是该 SQL 语句所需要的类型,则 KingbaseES 数据库返回错误。

departments 必须是表、视图或者可以是可以解析为表或视图的私有同义词。如果 departments 是序列,则 KingbaseES 数据库返回错误。

  1. 如果该对象到目前为止没有在任何名称空间中被搜索到,则 KingbaseES 数据库将搜索包含公有同义词的命名空间。

如果对象在包含公有同义词的命名空间中,则 KingbaseES 数据库尝试执行SQL语句。如果此对象的类型不是该SQL语句所需要的类型,则 KingbaseES 数据库返回错误。

在此示例中,如果 departments 是一个代表了序列的公有同义词,那么 KingbaseES 数据库将返回错误。

如果公有同义词包含任何依赖表或用户自定义类型,则不能在与依赖对象相同的 Schema 中创建与同义词同名的对象。

反之,如果同义词没有任何依赖表或用户定义的类型,则可以在与依赖对象相同的 Schema 中创建具有相同名称的对象。

KingbaseES数据库会使所有依赖对象无效,并在下一次访问它们时进行重新验证。

3.10.2. 引用其他 Schema 中的对象

如果要引用的对象属于其他Schema,需要在对象名称前添加对应的Schema名称。

语法如下: schema.object

以下示例展示了在名称为 hr的Schema中删除表employees:

DROP TABLE hr.employees;

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

要引用本地数据库以外的数据库中的对象,请在对象名称后面加上指向该数据库的数据库链接。数据库链接(database link)是一个模式对象,它能让KingbaseES 连接到远程数据库以访问那里的对象。

示例:

select * from departments@mydblink

具体database link创建,请参见"CREATE DATABASE LINK"。

3.10.4. 引用分区表和索引

表和索引可以分区。分区时,这些模式对象由许多称为partitions的部分组成,所有这些部分都具有相同的逻辑属性。

例如,表中的所有分区共享相同的列和约束定义,索引中的所有分区共享相同的索引列。

分区扩展名和子分区扩展名允许用户仅在一个分区或子分区上执行一些分区级和子分区级操作,例如从一个分区或子分区中删除所有行。

分区扩展名称让用户可以像使用表一样使用分区。

用户可以通过如下 SQL 语法指定分区扩展表名和子分区扩展表名。

分区扩展表名的语法如下: PARTITION partition

子分区扩展表名的语法如下: SUBPARTITION subpartition

DML 语句 INSERT、 UPDATE、 DELETE和 ANALYZE语句需要在分区或子分区名称的周围加上括号。

  • 扩展名称的限制

扩使用分区扩展表名和子分区扩展表名时有以下限制:

名称中没有同义词。必须使用基表指定分区或子分区扩展名,不能使用同义词、视图或任何其他对象。

在 PARTITION 和 SUBPARTITION 子句中,不能为分区或子分区名称指定绑定变量。

示例:

分区表 sales 具有分区 sales_q1_2021 ,并为其创建视图,然后从分区中删除一些行。

/为分区 sales_q1_2000 创建视图 Q1_2021_sales/

CREATE VIEW Q1_2021_sales ASSELECT * FROM sales PARTITION (SALES_Q1_2021);

/删除视图 Q1_2021_sales 中符合条件 amount_sold < 0 的值/

DELETE FROM Q1_2021_sales WHERE amount_sold < 0;

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

在 SQL 语句中引用对象类型属性或方法,必须使用表别名完全限定引用。

如下示例:

包含一个类型cust_address_typ和一个表customers,其中的cust_address列类型是cust_address_typ:

CREATE TYPE cust_addr_typ 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 = '610000' WHERE c.cust_address.city = 'chengdu' AND c.cust_address.state_province = 'SICHUAN';

要引用不接受参数的成员方法,必须提供空括号。

例如,一个基于catalog_typ的对象表 category_tab,该表包含成员函数 getCatalogName。为了在SQL语句中调用此方法,必须提供空括号。

如下所示:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值