ITPub博客

首页 > 数据库 > 国内数据库 > YashanDB 用户自定义类型

YashanDB 用户自定义类型

国内数据库 作者:崖山数据库系统YashanDB 时间:2025-03-28 16:37:57 0 删除 编辑

YashanDB支持通过PL语法创建一个 UDT(自定义类型)对象,成功创建的UDT对象可以作为数据类型被列字段进行声明。

用户自定义类型只能在HEAP表上使用,不参与普通标量数据类型之间的转换和运算,且存在如下限制:

  • 不能将某个列字段的数据类型修改为UDT,或者将UDT修改为其他类型。
  • UDT字段不能作为分区列、索引列、外键列。
  • 不能通过直接指定字段名的方式查询,而应该用本文所描述的方式。
  • 为一个分区表定义了非分区的Nested Table列时,不允许drop/truncate该表的分区。
  • 包含Nested Table列的表回收站无效,即无法闪回。

#Object类型

Object为面向对象概念的抽象数据类型,包含属性和方法,YashanDB支持将一个Object表示的对象结构数据作为列字段存储在物理表中。

在定义一个未包含Nested Table类型属性的Object类型时:

  • Object类型的声明方法与普通标量数据类型相同,且可通过对象初始化方法插入或更新数据。

  • Object类型数据通过表别名.列名.属性名的方式查询。

在定义一个包含Nested Table类型属性的Object类型时:

示例(HEAP表)

DROP TABLE IF EXISTS city;--创建一个Object UDT,包含population和province两个属性CREATE OR REPLACE TYPE obj_city AS OBJECT(population INT, province VARCHAR(20));/--创建city表并插入数据CREATE TABLE city (id INT, info obj_city);INSERT INTO city VALUES(1, obj_city(2000, 'guangdong'));INSERT INTO city VALUES(2, obj_city(2500, 'guangdong'));--更新数据UPDATE city SET info = obj_city(2500, 'shanghai') WHERE id=2;COMMIT;--通过表别名.列名.属性名的方式查询数据SELECT id, c.info.population, c.info.province FROM city c;
          ID INFO.POPULATION INFO.PROVINCE         
------------ --------------- --------------------- 
           1            2000 guangdong            
           2            2500 shanghai
Copied!

#Varray类型

Varray为一个包含有序元素的数组集合,YashanDB支持将一个Varray表示的数组结构数据作为列字段存储在物理表中。

Varray类型的声明方法与普通标量数据类型相同,且可通过对象初始化方法插入或更新数据。

Varray类型数据可通过如下方式查询:

  • 数组函数,例如 ARRAY_TO_STRING。
  • table()方法,语法详见 SELECT语句中的table_collection_clause描述。

示例(HEAP表)

DROP TABLE IF EXISTS city;--创建一个Object UDTCREATE OR REPLACE TYPE arr_type AS VARRAY(5) OF CHAR(10);/--创建city表并插入数据CREATE TABLE city (id INT, info arr_type);INSERT INTO city VALUES(1, arr_type('2000', 'guangdong'));INSERT INTO city VALUES(2, arr_type('2500', 'guangdong'));--更新数据UPDATE city SET info = arr_type('2500', 'shanghai') WHERE id=2;COMMIT;--通过数组函数访问数据SELECT id, ARRAY_TO_STRING(info,',') infos FROM city;
          ID INFOS                                                            
------------ ---------------------------------------------------------------- 
           1 2000,guangdong                                                  
           2 2500,shanghai 
           
--通过table()方法访问数据SELECT /*+ LEADING(c,arr) */ id, arr.*FROM city c, TABLE(c.info) arr;
          ID COLUMN_VALUE  
------------ ------------- 
           1 2000         
           1 guangdong    
           2 2500         
           2 shanghai
Copied!

#Nested Table类型

Nested Table为一个与表一样包含多行元素的集合,YashanDB支持将一个Nested Table表示的表结构数据作为列字段存储在物理表中。

Nested Table的数据并不是直接存储在所声明的表中,而是需要新建一个嵌套表存储。因此,定义一个Nested Table类型的列字段,或者一个包含了Nested Table类型属性的列字段时,需要同时指定该Nested Table数据存储的嵌套表信息用于新建。

新建的嵌套表依附于列字段所在主表,不可以单独对其执行DDL/DML操作,随着主表(或主表分区)的drop/truncate而drop/truncate。

通过DBA_NESTED_TABLES/USER_NESTED_TABLES/ALL_NESTED_TABLES可查询嵌套表相关信息。

Nested Table类型的声明方法见 CREATE TABLE中nested_table_clause子句描述。

可通过对象初始化方法插入或更新Nested Table数据。

对Nested Table数据的查询需使用table()方法,语法详见SELECT语句中的 table_collection_expression描述。

示例(HEAP表)

DROP TABLE IF EXISTS city;--创建一个Nested Table UDTCREATE OR REPLACE TYPE user_table_type IS TABLE OF CHAR(10);/--创建包含嵌套表的主表CREATE TABLE city (id INT, info user_table_type) NESTED TABLE info STORE AS nt_city;--插入数据INSERT INTO city VALUES (1, user_table_type('2000','2500'));INSERT INTO city VALUES (2, user_table_type('guangdong','guangdong'));--修改数据UPDATE city SET info = user_table_type('guangdong','shanghai')WHERE id = 2;COMMIT;--查询数据SELECT /*+ LEADING(c) */ id, tab.*FROM city c, TABLE(c.info) tab;
          ID COLUMN_VALUE  
------------ ------------- 
           1 2000         
           1 2500         
           2 guangdong    
           2 shanghai 
           
DROP TABLE IF EXISTS provs;--创建包含Nested Table属性的Object UDTCREATE OR REPLACE TYPE obj_type_nested IS OBJECT(name CHAR(10), citys user_table_type);/--创建包含Object UDT字段的表CREATE TABLE provs(id INT, province obj_type_nested)NESTED TABLE province.citys STORE AS nt_province;--插入数据INSERT INTO provs VALUES(1,
                       obj_type_nested('guangdong', user_table_type('shenzhen','guangzhou')));
                       --查询数据SELECT /*+ LEADING(p) */ p.id, p.province.name, c2.*FROM provs p, TABLE(p.province.citys) c2;
          ID PROVINCE.NAME COLUMN_VALUE  
------------ ------------- ------------- 
           1 guangdong     shenzhen     
           1 guangdong     guangzhou


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3079381/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据管理解决方案。

注册时间:2023-04-11

  • 博文量
    722
  • 访问量
    640225