
# 集合
#### 集合类型的使用
在使用集合之前，需要自定义一个集合类型。
在存储过程中紧跟AS关键字后面定义集合类型。定义方法如下。
![](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/figure/zh-cn_image_0000002185614434.png "点击放大")
其中：
- table_type：要定义的集合类型名。
- TABLE：表示要定义的集合类型。
- data_type：要创建的集合中成员的类型。
- indexby_type：创建集合索引的类型。
![](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 在GaussDB中，集合会自动增长，访问越界会返回一个NULL，不会报错。
- 在存储过程中定义的集合类型，其作用域仅在该存储过程中。
- 索引的类型仅支持integer和varchar类型，其中varchar的长度暂不约束。
- NOT NULL只支持语法不支持功能。
- data_type可以为存储过程内定义的record类型，集合类型（匿名块不支持），不可以为数组类型。
- 不支持跨package的嵌套集合类型变量使用。
- 不支持record嵌套table of index by类型的变量作为存储过程的出入参。
- 不支持table of index by类型的变量作为函数的出入参。
- 不支持通过raise info打印整个嵌套table of变量。
- 不支持跨自治事务传递table of变量。
- 不支持存储过程的出入参定义为嵌套table of类型。
 
GaussDB支持使用圆括号来访问集合元素，且还支持一些特有的函数，如extend，count，first，last，prior，next，delete来访问集合的内容。
集合函数支持multiset union/intersect/except all/distinct函数。
![](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 同一个表达式里不支持两个以上table of index by类型变量的函数调用。
- 慎用delete删除单个元素功能，会造成元素顺序错乱。
 
#### 示例
```
--演示在存储过程中对集合进行操作。
openGauss=# CREATE OR REPLACE PROCEDURE table_proc AS
DECLARE
       TYPE TABLE_INTEGER IS TABLE OF INTEGER;--定义集合类型
       TABLEINT TABLE_INTEGER := TABLE_INTEGER();  --声明集合类型的变量 
BEGIN 
       TABLEINT.extend(10);  
       FOR I IN 1..10 LOOP  
               TABLEINT(I) := I; 
       END LOOP; 
       DBE_OUTPUT.PRINT_LINE(TABLEINT.COUNT);  
       DBE_OUTPUT.PRINT_LINE(TABLEINT(1));  
       DBE_OUTPUT.PRINT_LINE(TABLEINT(10)); 
END;  
/
--调用该存储过程。
openGauss=# CALL table_proc();
--删除存储过程。
openGauss=# DROP PROCEDURE table_proc;
--演示在存储过程中对嵌套集合进行操作。
openGauss=# CREATE OR REPLACE PROCEDURE nest_table_proc AS
DECLARE
       TYPE TABLE_INTEGER IS TABLE OF INTEGER;--定义集合类型
       TYPE NEST_TABLE_INTEGER IS TABLE OF TABLE_INTEGER;--定义集合类型
       NEST_TABLE_VAR NEST_TABLE_INTEGER; --声明嵌套集合类型的变量
BEGIN 
       FOR I IN 1..10 LOOP  
               NEST_TABLE_VAR(I)(I) := I; 
       END LOOP; 
       DBE_OUTPUT.PRINT_LINE(NEST_TABLE_VAR.COUNT);  
       DBE_OUTPUT.PRINT_LINE(NEST_TABLE_VAR(1)(1));  
       DBE_OUTPUT.PRINT_LINE(NEST_TABLE_VAR(10)(10)); 
END;  
/
--调用该存储过程。
openGauss=# CALL nest_table_proc();
--删除存储过程。
openGauss=# DROP PROCEDURE nest_table_proc;
```
