更新时间:2024-11-26 GMT+08:00
分享

集合和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只支持语法不支持功能,即不会校验元素是否为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类型。

表8 record变量操作

序号

Oracle数据库

GaussDB数据库

1

构造器

支持

2

%ROWTYPE声明变量

支持

3

定义常量constant

不支持

表9 集合相关函数

序号

Oracle数据库

GaussDB数据库

差异

1

unnest_table(anynesttable)

支持

-

2

unnest_table(anyindexbytable)

支持

-

3

table(anyarray)

不支持

GaussDB使用unnest(anyarray)函数进行等价改写。

相关文档