
# 集合和Record
表1类型 
| 序号 | Oracle数据库                             | GaussDB数据库 |
|:---|:---|:---|
| 1  | Associative array (or index-by table) | 支持         |
| 2  | VARRAY (variable-size array)          | 支持         |
| 3  | Nested table                          | 支持         |
| 4  | record                                | 支持         |
   
表2语法 
| 序号 | Oracle数据库                                                                                                                                                                                                                                                                                                      | GaussDB数据库 | 差异                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| 1  | Associative array (or index-by table)语法： TABLE OF datatype \[ NOT NULL \] INDEX BY { PLS_INTEGER \| BINARY_INTEGER \| VARCHAR2 ( v_size ) \| data_type } | 支持，有差异     | - GaussDB不支持 PLS_INTEGER类型，GaussDB内data_type可以为基础数据类型、或存储过程内定义的record类型、集合类型、数组类型，不支持ref cursor类型。    - GaussDB内NOT NULL只支持语法不支持功能，即不会校验元素是否为NULL。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> 集合"章节。                                                      |
| 2  | VARRAY (variable-size array)语法： { VARRAY \| \[ VARYING \] ARRAY } ( size_limit ) OF datatype \[ NOT NULL \]                                         | 支持，有差异     | - GaussDB内不支持NOT NULL语法。  - GaussDB内不支持datatype为varray类型（varray不能嵌套）。  - size_limit功能生效需要在behavior_compat_optionsGUC参数中开启varray_compat参数。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> 数组"章节。   |
| 3  | Nested table语法： TABLE OF datatype \[ NOT NULL \]                                                                                                                                                                                   | 支持，有差异     | - GaussDB内NOT NULL只支持语法不支持功能。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> 集合"章节。                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 4  | record语法： TYPE record_type IS RECORD ( field_definition \[, field_definition\]... ) ;                                                                                                                                             | 支持         | - record的列可以定义为NOT NULL属性也可以指定默认值。其他类型嵌套record类型，record类型的默认值和NOT NULL不生效；通过package.record_type访问类型的形式来创建record变量，该record变量的默认值和NOT NULL不生效。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> record "章节。                                                                                                                                                                                                                                                                                                         |
   
表3构造器 
| 序号 | Oracle数据库                                       | GaussDB数据库 |
|:---|:---|:---|
| 1  | collection_type ( \[ value \[, value \]... \] ) | 支持         |
   
表4变量赋值 
| 序号 | Oracle数据库                             | GaussDB数据库 | 差异                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| 1  | Associative array (or index-by table) | 支持         | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 2  | VARRAY (variable-size array)          | 支持，有差异     | - GaussDB不同VARRAY类型的数据可以相互赋值，取决于其元素之间是否能相互隐式转换。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> 数组"章节。       |
| 3  | Nested table                          | 支持         | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 4  | record                                | 支持，有差异     | - GaussDB不同record类型的数据可以相互赋值，取决于列与列之间是否能相互隐式转换。  - 详情可参考《开发指南》中"存储过程 \> 数组、集合和record \> record "章节。   |
   
表5集合操作符 
| 序号 | Oracle数据库                                                                                                                                                                                                             | GaussDB数据库 | 差异                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| 1  | =                                                                                                                                                                                                                     | 支持，有差异     | - Oracle：比较时忽略集合成员先后顺序。  - GaussDB：比较时严格按照集合成员先后顺序。     |
| 2  | \<\>                                                                                                                                                                                                                  | 支持，有差异     | - Oracle：比较时忽略集合成员先后顺序。  - GaussDB：比较时严格按照集合成员先后顺序。     |
| 3  | IS\[NOT\] NULL                                                                                                                                                                                                        | 支持         | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 4  | \^=                                                                                                                                                                                                                   | 支持，有差异     | - Oracle：比较时忽略集合成员先后顺序。  - GaussDB：比较时严格按照集合成员先后顺序。   |
| 5  | \~=                                                                                                                                                                                                                   | 不支持        | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 6  | IS\[NOT\] A SET                                                                                                                                                                                                       | 不支持        | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 7  | IS \[NOT\] EMPTY                                                                                                                                                                                                      | 不支持        | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 8  | expr \[ NOT \] MEMBER \[ OF \] nested_table                                                                                                                                                                           | 不支持        | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 9  | nested_table1 \[ NOT \] SUBMULTISET \[ OF \] nested_table2 | 不支持        | -                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 10 | \[NOT\] IN                                                                                                                                                                                                            | 支持         | - Oracle：比较时忽略集合成员先后顺序。  - GaussDB：比较时严格按照集合成员先后顺序。          |
   
表6集合MULTISET函数 
| 序号 | Oracle数据库                              | GaussDB数据库 |
|:---|:---|:---|
| 1  | MULTISET UNION \[ALL \| DISTINCT\]     | 支持         |
| 2  | MULTISET EXCEPT \[ALL \| DISTINCT\]    | 支持         |
| 3  | MULTISET INTERSECT \[ALL \| DISTINCT\] | 支持         |
   
表7集合类型函数 
| 序号 | Oracle数据库                  | GaussDB数据库 | 差异                     |
|:---|:---|:---|:---|
| 1  | exists(idx)                | 支持         | -                      |
| 2  | extend\[(count\[, idx\])\] | 支持，有差异     | GaussDB仅支持nesttable类型。 |
| 3  | delete\[(idx1\[, idx2\])\] | 支持         | -                      |
| 4  | trim\[(n)\]                | 支持，有差异     | GaussDB仅支持nesttable类型。 |
| 5  | count                      | 支持         | -                      |
| 6  | first                      | 支持         | -                      |
| 7  | last                       | 支持         | -                      |
| 8  | prior(idx)                 | 支持         | -                      |
| 9  | next(idx)                  | 支持         | -                      |
| 10 | limit                      | 支持，有差异     | GaussDB仅支持nesttable类型。 |
   
表8record变量操作 
| 序号 | Oracle数据库    | GaussDB数据库 |
|:---|:---|:---|
| 1  | 构造器          | 支持         |
| 2  | %ROWTYPE声明变量 | 支持         |
| 3  | 定义常量constant | 不支持        |
   
表9集合相关函数 
| 序号 | Oracle数据库                     | GaussDB数据库 | 差异                                 |
|:---|:---|:---|:---|
| 1  | unnest_table(anynesttable)    | 支持         | -                                  |
| 2  | unnest_table(anyindexbytable) | 支持         | -                                  |
| 3  | table(anyarray)               | 不支持        | GaussDB使用unnest(anyarray)函数进行等价改写。 |
   
