Skip to content

集合类型

类型介绍

数据库提供了变长数组(VARRAY)、嵌套表(TABLE)、索引表(ITABLE,也称联合数组)三种同质元素的集合类型。

以上三者区别如下表所示。

属性变长数组(VARRAY)嵌套表(TABLE)索引表(ITABLE)
是否可用于SQL可用可用不可用
表字段类型可用,数据在同一表中可用,数据在同一表中不可用
初始化声明时自动完成声明时自动完成声明时自动完成
未初始化状态引用时非法访问引用时非法访问元素未定义
数据连续性连续连续,删除后不连续不连续(稀疏)
是否有界有size界可以扩展无界
扩展方法EXTENDEXTEND,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)无需初始化。