云数据库 GAUSSDB-集合类型的使用:带索引的集合类型

时间:2024-11-13 14:45:17

带索引的集合类型

该集合类型将下标和对应成员值以键值对的方式存储在HASH表中,对该类型变量的所有操作实际就是对HASH表的操作。用户无需自行扩展或释放存储空间,仅需通过赋值或delete方式进行存储和删除成员。集合相关操作、说明如下:

  1. 类型定义

    索引集合类型定义需同时指定成员类型data_type和下标类型indexby_type,其中下标类型仅支持INTEGER和VARCHAR。

  2. 变量声明和初始化

    索引集合类型声明后存在3种初始化场景:未初始化、初始化为空、初始化指定下标和成员值。其中未初始化和初始化为空场景对变量的效果一致。未初始化或初始化为空后变量不为NULL,后续都可以对变量直接进行赋值。初始化指定下标和成员值场景会将指定的下标和成员值以键值对的形式保存到变量中。

  3. 变量赋值

    索引集合类型变量赋值分为两种:成员赋值和整体赋值。成员赋值可通过指定下标方式对某个成员赋值,若该成员不存在则直接赋值,若存在则刷新该成员值。整体赋值则会将被赋值变量中原有成员都清空后重新保存新的成员值。整体赋值场景不能给变量赋NULL值,否则报错。

  4. 变量取值

    通过指定下标方式可获取变量中对应下标的成员值,若通过下标找不到该成员则会返回no data found的错误信息。

  • 非兼容ORA模式下(参数sql_compatibility值不为ORA),不支持创建带索引集合类型。
  • 支持在匿名块、存储过程、自定义函数、package中定义带索引集合类型,其作用域各不相同。不支持在schema中定义带索引集合类型。
  • NOT NULL只支持语法不支持功能。
  • 当data_type为VARCHAR、NUMERIC等可以定义长度和精度的类型时,要校验集合的元素长度或者将元素转换成对应的精度,需要开启tableof_elem_constraints参数(设置behavior_compat_options参数值为tableof_elem_constraints)。
  • data_type为数组类型时,数组类型的元素长度校验或精度转换也受参数tableof_elem_constraints是否开启影响。
  • 通过数组类型转换成的集合类型的值不支持对元素长度校验或精度转换。
  • data_type可以为基础数据类型,或存储过程内定义的record类型、集合类型和数组类型,不支持ref cursor类型。
  • indexby_type仅支持INTEGER和VARCHAR。
  • indexby_type为VARCHAR时,开启参数tableof_elem_constraints后在对带索引集合类型赋值时会校验index值的长度,校验行为不受char_coerce_compat参数是否开启影响,index长度大于定义长度则报错;不开启参数tableof_elem_constraints则不会对索引值进行长度校验。
  • 未初始化的带索引集合类型变量非NULL。
  • 带索引集合类型变量不能赋NULL值,否则报错。
  • 带索引集合类型变量作为入参不能赋NULL值或''。
  • 不同的带索引集合类型的变量不能相互赋值。即使成员类型和下标类型相同,但集合类型名称不同,也是不同的集合类型。如 TYPE t1 IS TABLE OF int index by int; 和 TYPE t2 IS TABLE OF int index by int; 定义的两个集合类型,t1和t2是不同的集合类型,以其定义的变量不支持相互赋值(作为成员类型时该约束不保证生效,赋值逻辑受父类型影响)。
  • 带索引集合类型不支持关系运算和算数运算操作。
  • SELECT ... bulk collect INTO 方式赋值带索引集合类型变量时,只支持下标为INTEGER类型的集合类型,下标为VARCHAR类型集合不支持。
  • 支持带索引集合类型变量作为函数的参数和返回值,此时要求参数或者返回值的类型是在package中定义的集合类型。
  • 带索引的集合作为函数入参时,可以传入对应子元素类型相同的数组类型作为入参,不支持多维数组,不支持索引类型为VARCHAR(过时的方法,不建议使用该功能。可执行“set behavior_compat_options = 'disable_rewrite_nesttable';”禁用)。
  • 类型构造器目前仅支持集合类型,其参数个数的上限与用户自定义函数参数个数上限相同。对于带索引的集合类型,构造器在使用时索引的值仅支持为常量。
  • 不支持对XML类型数据操作。
  • 集合类型以及嵌套集合的类型不支持作为表中的一列来创建表。
  • 集合类型的构造器不支持浮点数以及表达式作为下标。
  • 在匿名块中定义的集合类型,匿名块执行ROLLBACK或发生EXCEPTION后,集合类型将无法继续使用。
  • set enable_recordtype_check_strict = on;后,成员是record类型,且record类型有列具有not null属性或default属性,在存储过程或PACKAGE编译时会报错。
  • 不支持在DML语句中访问非Schema中定义的集合类型的元素。
support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0762.html