嵌套表类型(TABLE)
类型介绍
嵌套表类型(SQL中称为多重集合类型)是在SQL2003中增加的,表示无序的相同类型数组元素的集合。数据库中使用TABLE OF关键字可以创建或声明嵌套表类型,嵌套表内的每个元素均有一个索引下标,代表元素在数组中的位置,且可以根据下标直接访问嵌套表元素。不同数组的是,嵌套表未经删减,元素数据位置是连续的,若删除中间位置的数据后,数据变成了离散的。
一般而言,E-R模式中的多值属性可以映射到SQL中的以多重集合为值的属性,若顺序是重要的,则使用SQL数组来代替多重集合。
语法格式
创建TABLE类型:
sql
CREATE OR REPLACE TYPE udt_name AS TABLE OF type_x;
查询表中TABLE数据:
sql
-- 查询table整体
SELECT c_1, udt_col FROM obj_tab;
SELECT udt_name(...) FROM dual;
-- 查询table的部分属性
SELECT udt_name(i) FROM udt_tab;
参数说明
udt_name
:定义的类型名称。type_x
:元素的数据类型,可以是基本数据类型(如 NUMBER、VARCHAR2等)或其他用户自定义类型。c_1
:普通列。udt_col
:嵌套表列,定义的用户定义类型udt_name的实例。i
:嵌套表中的某列。
示例
创建用户定义类型(UDT),使用这些类型创建表,并进行插入和查询操作。
创建VARRAY类型,定义了一个对象类型udt_obj_type和一个可变数组类型udt_ttabofobj_type。
sqlCREATE OR REPLACE TYPE udt_ttabofobj_type AS TABLE OF udt_obj_type;
创建表。创建了一个表ttab_tab,其中包含一个列 udt_ttabofobj,其数据类型为udt_ttabofobj_type。
sqlCREATE TABLE ttab_tab(id INT, state VARCHAR2, type VARCHAR, udt_ttabofobj udt_ttabofobj_type);
插入数据。
- 使用构造函数插入数据。可以直接使用构造函数在INSERT语句中插入数据。sql
--字段类型 INSERT INTO ttab_tab (id, state, type, udt_ttabofobj) VALUES ( 2, '构造函数插入', 'udt_ttabofobj_type', udt_ttabofobj_type( udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00'), udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00') ) );
- 使用变量插入数据。在PL/SQL块中声明一个变量,然后将该变量插入到表中。sql
-- 变量类型 DECLARE udt_ttabofobj udt_ttabofobj_type; BEGIN udt_ttabofobj := udt_ttabofobj_type( udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') ); INSERT INTO varry_tab (id, state, type, udt_ttabofobj) VALUES (2, 'plsql通过udt变量插入数据', 'udt_ttabofobj_type', udt_ttabofobj); END; /
- 使用构造函数插入数据。可以直接使用构造函数在INSERT语句中插入数据。
查询数据。利用table()方法把table类型的数据当成表值调用,把它当成表查询包含的成员值。
- 可以查询表中的udt_varryofobj列,查看整个UDT对象。sql
SELECT id, udt_varryofobj FROM ttab_tab; ID | UDT_TTABOFOBJ | ------------------------------------------------------------------------------ 2 | [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]| 2 | [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]|
- 直接在SQL语句中创建UDT对象并查看其内容。sql
SELECT udt_ttabofobj_type( udt_obj_type( 1.0,'2层','udt_obj_type','2021-08-24 00:00:00') , udt_obj_type( 1.0,'2层','udt_obj_type','2021-08-24 00:00:00') ) FROM DUAL; EXPR1 | ------------------------------------------------------------------------------ [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]|
- 查询UDT的部分属性。sql
SELECT udt_ttabofobj(1),udt_ttabofobj(2) FROM ttab_tab; EXPR1 | EXPR2 | ------------------------------------------------------------------------------ [1,2层,udt_obj_type,2021-08-24 00:00:00]| [1,2层,udt_obj_type,2021-08-24 00:00:00]| [1,2层,udt_obj_type,2021-08-24 00:00:00]| [1,2层,udt_obj_type,2021-08-24 00:00:00]|
- 可以查询表中的udt_varryofobj列,查看整个UDT对象。