本文介绍了集合类型的概述及使用限制等内容。

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 TYPEDROP PACKAGE才能删除。

使用限制

  • 不支持关联数组初始化构造器。

  • 不支持限定表达式和迭代器的构造形式。

  • 不支持多维集合类型或是集合类型与记录类型的多层嵌套使用。

  • 不支持MULTISET相关的操作。

  • 当您使用delete删除集合变量的元素但保留占位符时,请不要使用该集合变量与表进行操作,以免出现非预期的结果。

  • 集合变量可以使用IS [NOT] NULL来判断是否为NULL。但在集合变量之间使用= <>来进行相等性或不等性比较时,返回的结果是无意义的。