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!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。