写点什么

YashanDB 用户自定义类型

作者:YashanDB
  • 2025-03-28
    广东
  • 本文字数:2262 字

    阅读完需:约 7 分钟

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 类型时:


  • 按 Nested Table 类型所描述的方法进行声明和使用。


示例(HEAP 表)


DROP TABLE IF EXISTS city;
CREATE OR REPLACE TYPE obj_city AS OBJECT(population INT, province VARCHAR(20));/

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;
CREATE OR REPLACE TYPE arr_type AS VARRAY(5) OF CHAR(10);/

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
SELECT 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;
CREATE 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 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;
CREATE OR REPLACE TYPE obj_type_nested IS OBJECT(name CHAR(10), citys user_table_type);/
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 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
复制代码


Copied!

发布于: 刚刚阅读数: 2
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB 用户自定义类型_数据库_YashanDB_InfoQ写作社区