
2.5.7 集合类型
1.变长数组
变长数组是一种具有可伸缩性的数组,它有一个最大容量。变长数组的下标是从1开始的有序数字,并提供多种方法操作数组中的项。定义变长数组的语法格式如下:

数据类型可以是基本数据类型,也可以是自定义类型或对象、记录、其他变长数组类型等。变长数组使构造复杂的结构成为可能。
【例2-13】一个简单的VARRAY使用示例。


2.索引表
索引表提供了一种快速、方便地管理一组相关数据的方法,是程序设计中的重要内容。通过索引表可以对大量类型相同的数据进行存储、排序、插入及删除等操作,从而可以有效地提高程序开发效率,改善程序的编写方式。
内存索引表是一组数据的集合,数据按照一定规则组织起来,形成一个可操作的整体,是对大量数据进行有效组织和管理的手段之一,通过函数可以对大量性质相同的数据进行存储、排序、插入及删除等操作,从而可以有效地提高程序开发效率及改善程序的编写方式。
内存索引表和数组类似,只是内存索引表使用起来更加方便,但是性能不如数组。数组在定义时需要用户指定数组的大小,当用户访问超过数组大小的数组元素时,系统会报错;内存索引表相当于一个一维数组,但不需要用户指定大小,大小根据用户的操作自动增减。语法格式如下:

第一个数据类型是索引表存放数据的类型,这个数据类型可以是基础数据类型,也可以是自定义类型或对象、记录、静态数组,但不能是动态数组;第二个数据类型是索引表的下标类型,目前仅支持INTEGER/INT和VARCHAR两种类型,分别代表整数下标和字符串下标。对于VARCHAR类型,长度不能超过1024B。
索引表的成员函数可以用来遍历索引表,或者查看索引表的信息。
【例2-14】索引表举例。

【例2-15】普通的索引表举例。


【例2-16】索引表存储游标记录举例。

【例2-17】利用索引表管理记录举例。


【例2-18】多维索引表的遍历举例。


3.嵌套表
嵌套表元素的下标从1开始,并且元素个数没有限制。嵌套表语法格式如下:

元素数据类型用于指明嵌套表元素的数据类型,当元素数据类型为一个定义了某个表字段的对象类型时,嵌套表就是某些行的集合,实现了表的嵌套功能。
【例2-19】嵌套表的使用示例。

4.集合的属性和方法
集合类型中的变长数组、索引表和嵌套表都是对象类型的,它们本身有属性或方法。
(1)COUNT属性。
COUNT是一个属性,它用于返回集合中的元素个数。
【例2-20】统计3种集合类型的元素个数。


(2)DELETE方法。
DELETE方法用于删除集合中的一个或多个元素。需要注意的是,由于DELETE方法执行删除操作的位置固定,因此对于可变数组来说没有DELETE方法。DELETE方法有以下3种形式。
① DELETE:不带参数的DELETE方法将整个集合删除。
② DELETE(x):将集合中第x个位置的元素删除。
③ DELETE(x,y):将集合中从第x个元素到第y个元素之间的所有元素删除。
注意,执行DELETE方法后,集合的COUNT值将会立刻变化;而且当要删除的元素不存在时,DELETE方法也不会报错,而是跳过该元素,继续执行下一步操作。
(3)EXISTS属性。
EXISTS属性用于判断集合中的元素是否存在。语法格式如下:

EXISTS(x)判断位于位置x的元素是否存在,如果存在,则返回TRUE;如果x超出集合的最大范围,则返回FALSE。
注意,当使用EXISTS属性判断时,只要在指定位置处有元素存在即可,即使该位置的元素为NULL,EXISTS属性也会返回TRUE。
(4)EXTEND方法。
EXTEND方法用于将元素添加到集合的末端,具体形式有以下3种。
① EXTEND:不带参数的EXTEND方法将一个NULL元素添加到集合的末端。
② EXTEND(x):将x个NULL元素添加到集合的末端。
③ EXTEND(x,y):将x个位于位置y的元素添加到集合的末端,也就是在集合末尾扩展x个与第y个元素值相同的元素。
说明:对内存索引表不适用。
(5)FIRST属性和LAST属性。
FIRST属性用于返回集合的第一个元素;LAST属性则返回集合的最后一个元素。
(6)LIMIT属性。
LIMIT属性用于返回集合中的最大元素个数。由于嵌套表没有上限,因此当嵌套表使用LIMIT属性时,总是返回NULL。
(7)NEXT属性和PRIOR属性。
NEXT属性和PRIOR属性返回指定位置之后或之前的元素。使用NEXT属性和PRIOR属性时,要有指定位置的参数。语法格式如下:

其中,NEXT(x)表示返回位置x处元素后面的那个元素;PRIOR(x)表示返回位置x处元素前面的那个元素。
(8)TRIM方法。
TRIM方法用于删除集合末端的元素,其具体形式如下。
① TRIM:不带参数的TRIM方法从集合末端删除一个元素。
② TRIM(x):从集合的末端删除x个元素,其中x要小于集合的COUNT值。