集合类型
类型介绍
数据库提供了变长数组(VARRAY)、嵌套表(TABLE)、索引表(ITABLE,也称联合数组)三种同质元素的集合类型。
以上三者区别如下表所示。
属性 | 变长数组(VARRAY) | 嵌套表(TABLE) | 索引表(ITABLE) |
---|---|---|---|
是否可用于SQL | 可用 | 可用 | 不可用 |
表字段类型 | 可用,数据在同一表中 | 可用,数据在同一表中 | 不可用 |
初始化 | 声明时自动完成 | 声明时自动完成 | 声明时自动完成 |
未初始化状态 | 引用时非法访问 | 引用时非法访问 | 元素未定义 |
数据连续性 | 连续 | 连续,删除后不连续 | 不连续(稀疏) |
是否有界 | 有size界 | 可以扩展 | 无界 |
扩展方法 | EXTEND | EXTEND,EXTEND() | 给新元素赋值 |
比较操作 | 支持 | 支持 | 支持 |
集合操作bulk collect into | 支持 | 支持 | 支持 |
元素数量 | 指定的 | 未指定的 | 未指定的 |
索引类型 | 整数 | 整数 | 整数或字符串 |
密集或稀疏 | 总是密集的 | 开始密集,删除中间值变得稀疏 | 稀疏 |
定义或声明 | 在 PL/SQL 块、包、存储过程、存储函数或在模式级别中 | 在 PL/SQL 块、包、存储过程、存储函数或在模式级别中 | 在 PL/SQL 块、包、存储过程或存储函数中 |
说明:
可以在SQL或PL/SQL中使用的集合类型,若在SQL中使用集合类型,必须是在模式级别中用CREATE TYPE语句创建的类型(如:表字段类型若为集合类型,则该集合类型是模式级别创建的类型)。
在PL/SQL中使用集合类型主要分为三步来完成,一是声明,二是初始化,三是赋值。初始化和赋值可以在声明块中完成,也可以在执行块中完成。集合类型在声明变量时,自动完成初始化。
集合声明
语法格式
集合的声明分为集合类型声明和集合类型的变量声明。
- 变长数组:sql
-- 集合类型声明 TYPE type_name IS VARRAY(size) OF type_x; -- 变量声明 variable_name type_name;
- 嵌套表:sql
-- 集合类型声明 TYPE type_name IS TABLE OF type_x; -- 变量声明 variable_name type_name;
- 索引表:sql
-- 集合类型声明 TYPE type_name IS TABLE OF type_x INDEX BY PLS_INTEGER; -- 变量声明 variable_name type_name;
参数说明
type_name
:定义的集合类型的名称。VARRAY(size)
:变长数组,其中size是这个数组的最大长度。type_x
:数据类型,可以是基本数据类型(如 NUMBER、VARCHAR2等)或其他用户自定义类型。variable_name
:变量名称。TABLE
:表类型。INDEX BY PLS_INTEGER
:表的索引是基于整数的。索引可以是非连续的,可以从任何整数值开始。
集合初始化和赋值
集合的初始化主要通过构造函数进行初始化。有以下4种方法(以VARRAY数组为例):
- 在声明块中声明集合,在声明块中使用构造函数初始化,在执行块中使用EXTEND方法进行赋值。sql
DECLARE TYPE type_name IS VARRAY(1) OF INT; -- 声明集合,使用构造函数初始化 variable_name type_name:= type_name(); BEGIN -- 使用EXTEND赋值 variable_name.EXTEND; variable_name(1) := 1; SEND_MSG(variable_name(1)); END; / -- 输出 1
- 在声明块中声明集合,在声明块中使用构造函数初始化并赋值。sql
DECLARE TYPE type_name IS VARRAY(1) OF INT; -- 声明集合,使用构造函数初始化并赋值 variable_name type_name:= type_name(1); BEGIN SEND_MSG(variable_name(1)); END; / -- 输出 1
- 在声明块中声明集合,在执行块使用构造函数初始化为空(EMPTY),在执行块中使用EXTEND方法进行赋值。sql
DECLARE TYPE type_name IS VARRAY(1) OF INT; -- 声明集合 variable_name type_name; BEGIN -- 使用构造函数初始化为空 variable_name := type_name(); -- 使用EXTEND赋值 variable_name.EXTEND; variable_name(1) := 1; SEND_MSG(variable_name(1)); END; / -- 输出 1
- 在声明块中声明集合,在执行块使用构造函数初始化并赋值。sql
DECLARE TYPE type_name IS VARRAY(1) OF INT; -- 声明集合 variable_name type_name; BEGIN -- 使用构造函数初始化并赋值 variable_name := type_name(1); SEND_MSG(variable_name(1)); END; / -- 输出 1
说明:
初始化为空表示的是一个空集合(EMPTY,但非NULL),而未初始化时是NULL(UNKNOWN值)。 变成数组类型(VARRAY)和嵌套表类型(TABLE)在赋值之前必须初始化,可以用EXTEND扩展,用构造函数初始化,而索引表(ITABLE)无需初始化。