数组类型
数组是一组数据的集合。集合中的数据类型可以是本章节中描述的基础数据类型。
常量表达式
语法格式:
ARRAY [ param ]
或
'{ param }'
功能:存储一组数据集合的数组。
参数说明:
- param :数组包含的值,允许出现零个或多个,多个值之间用逗号分隔,成员没有值可填写为NULL。
- 以'{ param }' 这种格式作为数组常量时,其中的字符串类型的元素不能再以单引号开始和结束,需要使用双引号。两个连续单引号转换为一个单引号。
- 以第一个元素的数据类型作为数组的数据类型,要求数组中所有元素的类型相同,或者能够相互转换。
注意:
- 不支持BINARY,VARBINARY,CLOB,BLOB,CURSOR,RAW,IMAGE数据类型的数组。
- 不支持多维数组。
- 不支持在数组类型的字段上创建索引、主键、外键和唯一键约束。
数组类型的应用场景
- 建表语句中支持将字段类型设置为数组类型:
通过在字段的数据类型后增加 [ ] 或者 [m] (m >= 0)标识字段是具有该数据类型的数组。给定的数组长度m没有实际作用。当前支持变长的数组,数组最大长度可达(2^31 - 1)。数组字段中的所有元素值实际存储于LOB段中。LOB段最大支持4GB,因此实际能够存储的元素个数取决于元素数据类型,不同的数据类型由于存储长度不同,导致存储的元素个数也不同。
- 访问数组类型的表字段
- SELECT
- 访问数组类型列的单个元素:
SELECT col_name[n] from table_name
下标从1开始。如果指定的下标元素没有赋值,则返回NULL。
- 访问多个连续元素:切片形式访问数组时,返回的仍然是数组类型(col_name [1:1] 返回的是具有1个元素值的数组)。指定范围内的元素如果没有赋值,返回NULL值。
- 数组类型的字段输出格式:
{ value }
value:数组中元素的值,允许出现零个或多个,value值之间以逗号分隔。没有赋值的元素统一输出为大写NULL。
- INSERT
- 新增一条记录。数组类型的字段值使用数组常量赋值。不赋值的元素值用NULL填充。
- 不支持分片的形式增加一条记录。
- 支持使用子查询返回结果方式写入数组字段。 要求返回结果集与表的字段数量相同外,还需要满足如下要求:
如果结果集存在数组类型字段,而表中对应的字段不是数组类型,则报错。
如果结果集中不存在数组类型字段,而表中对应的字段为数组类型,会检查结果集中的字段是否可以转换为数组类型:要求字段的值为 '{value, [...]}' 类型的字符串类型。如果是其他类型,则不能转换为数组类型,会报错。
如果结果集中存在数组类型字段,表中对应字段也为数组类型,且结果集中的元素数据类型能够转换为表字段定义的数据类型,则新增记录成功,反之则报错。
- UPDATE
- 更新单个元素的值:将数组字段中指定元素的值更新
UPDATE table_name SET col_name[n] = value ;
- 更新多个连续的元素值:
UPDATE table_name SET col_name[m:n] = value;
更新的规则如下:右边数组第一个元素赋予col_name[m], 第二个元素赋予col_name[m+1], 以此类推,直到col_name[n]元素值。如果元素数量不匹配,则报错:GS-01363:source array elements count does not match。
- 更新时指定的元素下标不能小于0,且不能超过 (2^31 - 1)。
- 支持以查询结果集方式更新数组元素的值。要求查询返回的值也是数组类型,或者可以转换为数组类型,且转换后的每个元素也能转换为对应表字段的数据类型。
- DELETE
- 删除一条记录时,记录中的数组字段中所有的值也会被删除。
- MERGE
MERGE INTO [ schema_name. ] table_name USING { [ schema_name. ] table_name | [ schema_name. ] view_name | select_query } [ alias ] ON ( condition ) { WHEN MATCHED THEN UPDATE SET column_name = expression [ , ... ] [ WHERE ( condition ) ] |WHEN NOT MATCHED THEN INSERT ( column_name [ , ... ] ) VALUES ( expression [ , ... ] ) [ WHERE ( condition ) ] }[ ... ]
select_query 子句遵循上述规范。
condition 子句中的匹配条件:支持访问数组类型的元素。
UPDATE子句和INSERT子句中支持访问数组类型的字段。
- 存储过程和自定义函数
- 支持存储过程和自定义函数的入参设置为数组类型。
CREATE [ OR REPLACE ] PROCEDURE [ IF NOT EXISTS ] [schema_name.]procedure_name(args_list) { IS | AS } [ param_list ] BEGIN statement; END; /
- args_list 参数列表,支持在输入参数(in 类型参数)的数据类型关键字后加上 [ ] 表示传入的参数是一个数组类型。
- 支持函数的返回值为数组类型。
CREATE [OR REPLACE] [IF [NOT] EXIST] FUNCTION [schema_name.]function_name [(args_list)] RETURN data_type { IS | AS } [param-list] BEGIN statement; RETURN expression; ... END;
- data_type : 返回值的数据类型,支持在数据类型关键字后加上 [ ] 表示返回的是一个数组类型,数组中的元素具有data_type指定的数据类型。
- 支持自定义变量为数组类型。
- 约束:
- 数组类型暂不支持操作符,包括:比较操作符(=,!=,>,<,>=,<=)、连接操作符(||), 关系操作符。
- order by 表达式中暂不支持包含数组类型。
- group by 表达式中暂不支持包含数组类型。
- where 表达式中暂不支持包含数组类型。仅允许通过[m] 获取数组中第m个元素的值,暂不支持分片形式。
- connect by表达式中暂不支持包含数组类型。
- having 表达式中暂不支持包含数组类型。
- 多表join时,暂不支持数组类型作为join条件。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论