![达梦数据库编程指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/136/43738136/b_43738136.jpg)
2.5.7 集合类型
1.变长数组
变长数组是一种具有可伸缩性的数组,它有一个最大容量。变长数组的下标是从1开始的有序数字,并提供多种方法操作数组中的项。定义变长数组的语法格式如下:
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1738867714-hAsrQRo6EswoQ9cc6ZWmLCz7eQtM2L46-0-1123e5399f25383c7f3a23141d77efaf)
数据类型可以是基本数据类型,也可以是自定义类型或对象、记录、其他变长数组类型等。变长数组使构造复杂的结构成为可能。
【例2-13】一个简单的VARRAY使用示例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1738867714-hGSeu8dTG3KqmQsZK8wiOcawT1eZOB8t-0-19f62ca61b438b19548d9ddf6a93b9f4)
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1738867714-95R7OA9hNophHrAm0yHRXePGvm793Bt1-0-926a6f74903b49756238c634e756e08f)
2.索引表
索引表提供了一种快速、方便地管理一组相关数据的方法,是程序设计中的重要内容。通过索引表可以对大量类型相同的数据进行存储、排序、插入及删除等操作,从而可以有效地提高程序开发效率,改善程序的编写方式。
内存索引表是一组数据的集合,数据按照一定规则组织起来,形成一个可操作的整体,是对大量数据进行有效组织和管理的手段之一,通过函数可以对大量性质相同的数据进行存储、排序、插入及删除等操作,从而可以有效地提高程序开发效率及改善程序的编写方式。
内存索引表和数组类似,只是内存索引表使用起来更加方便,但是性能不如数组。数组在定义时需要用户指定数组的大小,当用户访问超过数组大小的数组元素时,系统会报错;内存索引表相当于一个一维数组,但不需要用户指定大小,大小根据用户的操作自动增减。语法格式如下:
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_38.jpg?sign=1738867714-mMTgYjLZ1tUIm4yc925FbLcVohxj3m84-0-3cbb9a1811716a17a4169ccff8148d95)
第一个数据类型是索引表存放数据的类型,这个数据类型可以是基础数据类型,也可以是自定义类型或对象、记录、静态数组,但不能是动态数组;第二个数据类型是索引表的下标类型,目前仅支持INTEGER/INT和VARCHAR两种类型,分别代表整数下标和字符串下标。对于VARCHAR类型,长度不能超过1024B。
索引表的成员函数可以用来遍历索引表,或者查看索引表的信息。
【例2-14】索引表举例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1738867714-FlELyEm5TYXT6NrvaJsVWNm7BgDJeZaO-0-d2c1c2e5aa173a460f42afbe4df9d888)
【例2-15】普通的索引表举例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1738867714-bvvdiS3Q56uRRR0N1rcWyHEiiJwctesj-0-49db73a98d5fd2862d0293e4d4698e81)
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1738867714-2Of1gJK6KdvEku16SYrKPUtZ5kT2FaT4-0-4ee5daadab520cce19b3be99de0a70cd)
【例2-16】索引表存储游标记录举例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1738867714-MZDK66LoPLbtm7cfgasAMT3qMUd21lbX-0-0aec21402c79a51ff6273b6bef54c4cb)
【例2-17】利用索引表管理记录举例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1738867714-AnI0TjBmDjLXzK030Sh6jD9cuwdzrwrA-0-2cfddf3eef4c7bc8f0b64c5b7182cf9c)
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1738867714-xhNzJlWtyebFjiLzmst2NPJco2phJUYu-0-3d663c01b9284cac90941c2f5eb72b93)
【例2-18】多维索引表的遍历举例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1738867714-YF4HM3lPtjKzqLuou7JEBLOPuwo5ek3n-0-bb867dfd561705b315d2efcd201a5452)
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1738867714-jhVb0phcBwPqWlgdeOrOwcFahkvlEYXP-0-0c1dfad39bf86d622452dc80a97ee277)
3.嵌套表
嵌套表元素的下标从1开始,并且元素个数没有限制。嵌套表语法格式如下:
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1738867714-bdyT7HsVl6OBDf1zECVfN3wpSeGNZ3y1-0-a2ac700e395b56403298b3196133ed7f)
元素数据类型用于指明嵌套表元素的数据类型,当元素数据类型为一个定义了某个表字段的对象类型时,嵌套表就是某些行的集合,实现了表的嵌套功能。
【例2-19】嵌套表的使用示例。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1738867714-GMT6nnJiU1ZQWzkChAMqTyjAF1XlItgO-0-3436ad8bb6b6f976681bdfab20ecf309)
4.集合的属性和方法
集合类型中的变长数组、索引表和嵌套表都是对象类型的,它们本身有属性或方法。
(1)COUNT属性。
COUNT是一个属性,它用于返回集合中的元素个数。
【例2-20】统计3种集合类型的元素个数。
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1738867714-MzGBfmFn7LlvjUxxNjdG8qPQg5X4FVF6-0-df3b069e0b5ca2d89ac01db69ae3d92b)
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1738867714-C26kru8uFusFvT4HdVnre9MS4fpxYEla-0-c85cece92127c4b4c316af2276d3017d)
(2)DELETE方法。
DELETE方法用于删除集合中的一个或多个元素。需要注意的是,由于DELETE方法执行删除操作的位置固定,因此对于可变数组来说没有DELETE方法。DELETE方法有以下3种形式。
① DELETE:不带参数的DELETE方法将整个集合删除。
② DELETE(x):将集合中第x个位置的元素删除。
③ DELETE(x,y):将集合中从第x个元素到第y个元素之间的所有元素删除。
注意,执行DELETE方法后,集合的COUNT值将会立刻变化;而且当要删除的元素不存在时,DELETE方法也不会报错,而是跳过该元素,继续执行下一步操作。
(3)EXISTS属性。
EXISTS属性用于判断集合中的元素是否存在。语法格式如下:
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1738867714-HOCKH3nxmW1HnDQjUNSBXC9xdOmYv4wb-0-67a302a61fdb19f1de5a44a1e06c2f2b)
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属性时,要有指定位置的参数。语法格式如下:
![img](https://epubservercos.yuewen.com/B7CF68/23020642809743806/epubprivate/OEBPS/Images/txt002_52.jpg?sign=1738867714-acUqRrlrZvaSjdxMgPdJCvj83u7WAug9-0-0ee3b883d3f4596ab9d353521a162683)
其中,NEXT(x)表示返回位置x处元素后面的那个元素;PRIOR(x)表示返回位置x处元素前面的那个元素。
(8)TRIM方法。
TRIM方法用于删除集合末端的元素,其具体形式如下。
① TRIM:不带参数的TRIM方法从集合末端删除一个元素。
② TRIM(x):从集合的末端删除x个元素,其中x要小于集合的COUNT值。