本文介绍了集合类型的概述及使用限制等内容。
PL/SQL拥有三种集合类型:变长数组(varray,variable-size array),嵌套表(nested table)和关联数组(associative array)。它们可以被声明在全局、包或者PL/SQL块里,并拥有一系列独特的用法。例如,您可以使用集合类型构造函数初始化变长数组和嵌套表,使用集合方法对集合进行扩容、缩容或查询,对集合进行取值和赋值,以及使用集合与表进行交互。
以上三种集合类型的区别如下:
集合类型 | 元素个数 | 索引(下标)类型 | 未初始化的状态 | 定义位置 |
变长数组 | 需要指定 | 正整数 | NULL | PL/SQL、全局或包 |
嵌套表 | 不需要指定 | 正整数 | NULL | PL/SQL、全局或包 |
关联数组 | 不需要指定 | 正整数或字符串 | 空 | PL/SQL或包 |
元素个数
如果指定了元素数量,则该数字为集合中元素的最大数量。如果不指定元素数量,则集合中的最大元素数量为索引类型的上限。
索引(下标)类型
通过索引来具体获取集合类型特定位置上的元素。
未初始化的状态
集合类型有三种状态:NULL、空以及存在元素的状态。对于变长数组和嵌套表来说,它们可能存在这三种状态的其中之一。当变长数组变量或是嵌套表变量被声明但没有初始化时,该变量的状态为NULL,表示该集合不存在。如果此时想要通过某个索引获取其中的值,会显示这是一个不存在的集合
。您可以通过构造函数的方式对其初始化,此时转变为空状态,代表该集合存在但不包含任何元素。如果此时想要通过某个索引获取其中的值,会显示不存在该元素
。对于关联数组来说,声明关联数组变量时会默认将其初始化为空,因此不存在NULL的状态。
定义位置
在PL/SQL块中定义的集合类型是局部类型。它仅在块中可用,并且仅当块在子程序中才会存储在数据库里。在全局或是包中定义的集合类型会直接存储在数据库的系统表中,直至您通过DROP TYPE
或DROP PACKAGE
才能删除。
使用限制
不支持关联数组初始化构造器。
不支持限定表达式和迭代器的构造形式。
不支持多维集合类型或是集合类型与记录类型的多层嵌套使用。
不支持
MULTISET
相关的操作。当您使用
delete
删除集合变量的元素但保留占位符时,请不要使用该集合变量与表进行操作,以免出现非预期的结果。集合变量可以使用
IS [NOT] NULL
来判断是否为NULL。但在集合变量之间使用=
、<
、>
来进行相等性或不等性比较时,返回的结果是无意义的。