数组支持的函数
在内层表达式中,不支持通过嵌套的方式调用数组类型函数。
- extend[(count[, idx])]
返回值:无返回值
功能描述:在varray变量末尾拓展1个或count个元素。存在idx下标元素时,拷贝count个idx下元素到变量末尾。
示例1:extend(count),默认扩展为NULL。
gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.EXTEND(3); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# END; gaussdb$# / 0 3 ANONYMOUS BLOCK EXECUTE
示例2:extend超过数组定义大小,同时开启varray_compat参数。
gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.EXTEND(3); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.EXTEND(8); -- error gaussdb$# END; gaussdb$# / 0 3 ERROR: Subscript outside of limit CONTEXT: PL/SQL function inline_code_block line 8 at assignment
示例3:extend(count, idx),扩展第idx位置的元素。
gaussdb=# set a_format_version='10c'; SET gaussdb=# set a_format_dev_version='s1'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1,2); gaussdb-# BEGIN gaussdb$# arrint.EXTEND(2, 1); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# FOR i IN 1..arrint.COUNT LOOP gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint(i)); gaussdb$# END LOOP; gaussdb$# END; gaussdb$# / 4 1 2 1 1 ANONYMOUS BLOCK EXECUTE
示例4:extend(count, idx),idx越界,同时开启了varray_compat参数。
gaussdb=# set a_format_version='10c'; SET gaussdb=# set a_format_dev_version='s1'; SET gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(); gaussdb-# BEGIN gaussdb$# arrint.EXTEND(10, 1); -- error index. gaussdb$# END; gaussdb$# / ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 5 at assignment
- count[()]
返回值:int4类型
功能描述:返回数组中的元素个数。
示例1:查看已初始化的数组元素个数。
gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER; gaussdb-# len int; gaussdb-# BEGIN gaussdb$# arrint := ARRAY_INTEGER(1, 2, 3); gaussdb$# len := arrint.COUNT(); gaussdb$# DBE_OUTPUT.PRINT_LINE(len); gaussdb$# END; gaussdb$# / 3 ANONYMOUS BLOCK EXECUTE
示例2:查看未初始化的数组元素个数,同时开启varray_compat参数。
gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER; gaussdb-# len int; gaussdb-# BEGIN gaussdb$# len := arrint.COUNT; gaussdb$# DBE_OUTPUT.PRINT_LINE(len); gaussdb$# END; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/SQL function inline_code_block line 6 at assignment
- trim[(n)]
返回值:无返回值
功能描述:无参数时,删除数组末尾一个元素空间,输入参数合法时,删除数组末尾指定数量元素空间。
示例1:删除数组中的n个元素,未开启参数varray_compat。
gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1,2,3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.TRIM(1); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# END; gaussdb$# / 3 2 ANONYMOUS BLOCK EXECUTE -- n > 数组元素个数 gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1,2,3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.TRIM(4); gaussdb$# END; gaussdb$# / 3 ANONYMOUS BLOCK EXECUTE
示例2:删除数组中的n个元素,同时打开varray_compat参数。
-- n > 数组元素个数 gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1,2,3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); -- count > 0. gaussdb$# arrint.TRIM(4); gaussdb$# END; gaussdb$# / 3 ERROR: Subscript outside of count ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 6 at assignment -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER; gaussdb-# BEGIN gaussdb$# arrint.TRIM(1); gaussdb$# END; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/SQL function inline_code_block line 5 at assignment
- delete[()]
返回值:无返回值
功能描述:清空数组中的元素。
示例1:清空数组中的元素,未开启参数varray_compat。
gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# END; gaussdb$# / 3 0 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER; gaussdb-# BEGIN gaussdb$# arrint.DELETE(); gaussdb$# END; gaussdb$# / ANONYMOUS BLOCK EXECUTE
示例2:清空数组中的元素,同时开启参数varray_compat。
gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# END; gaussdb$# / 3 0 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER; gaussdb-# BEGIN gaussdb$# arrint.DELETE(); gaussdb$# END; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/SQL function inline_code_block line 5 at assignment
- delete(idx)
返回值:无返回值
功能描述:删除数组中某个位置的元素。
示例1:删除数组中的某个元素。
gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(2); gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# FOR i IN 1..arrint.COUNT LOOP gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint(i)); gaussdb$# END LOOP; gaussdb$# END; gaussdb$# / 3 2 1 3 ANONYMOUS BLOCK EXECUTE
示例2:idx非法
-- 未开参数varray_compat gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(4); gaussdb$# raise info '%', arrint; gaussdb$# END; gaussdb$# / 3 INFO: {1,2,3} ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(11); gaussdb$# raise info '%', arrint; gaussdb$# END; gaussdb$# / 3 INFO: {1,2,3} ANONYMOUS BLOCK EXECUTE -- 开启参数varray_compat gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(4); gaussdb$# END; gaussdb$# / 3 ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 6 at assignment gaussdb=# DECLARE gaussdb-# TYPE ARRAY_INTEGER IS VARRAY(10) OF INTEGER; gaussdb-# arrint ARRAY_INTEGER := ARRAY_INTEGER(1, 2, 3); gaussdb-# BEGIN gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# arrint.DELETE(11); gaussdb$# END; gaussdb$# / 3 ERROR: Subscript outside of limit CONTEXT: PL/SQL function inline_code_block line 6 at assignment
- first
返回值:int4类型
功能描述:返回集合中第一个有效元素的下标。
示例:
gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc'); gaussdb-# BEGIN gaussdb$# raise info 'FIRST is %',v.FIRST; gaussdb$# END; gaussdb$# / INFO: FIRST is 1 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR(); gaussdb-# BEGIN gaussdb$# raise info 'FIRST is %',v.FIRST; gaussdb$# END; gaussdb$# / INFO: FIRST is <NULL> ANONYMOUS BLOCK EXECUTE
- last
返回值:int4类型
功能描述:返回数组中最后一个有效元素的下标。
示例1:
gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc'); gaussdb-# BEGIN gaussdb$# raise info 'LAST is %',v.LAST; gaussdb$# END; gaussdb$# / INFO: LAST is 2 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR(); gaussdb-# BEGIN gaussdb$# raise info 'LAST is %',v.LAST; gaussdb$# END; gaussdb$# / INFO: LAST is <NULL> ANONYMOUS BLOCK EXECUTE
- prior(idx)
返回值:int4类型
功能描述:返回集合中当前下标的前一个有效元素下标。
示例:
gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc'); gaussdb-# BEGIN gaussdb$# raise info 'prior is %',v.prior(2); gaussdb$# END; gaussdb$# / INFO: prior is 1 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR(); gaussdb-# BEGIN gaussdb$# raise info 'prior is %',v.prior(2); gaussdb$# END; gaussdb$# / INFO: prior is <NULL> ANONYMOUS BLOCK EXECUTE -- 访问越界 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc','qwe'); gaussdb-# BEGIN gaussdb$# raise info 'prior is %',v.prior(10); gaussdb$# END; gaussdb$# / INFO: prior is 3 ANONYMOUS BLOCK EXECUTE
- next(idx)
返回值:int4类型
功能描述:返回集合中当前下标的后一个有效元素下标。
示例:
gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc'); gaussdb-# BEGIN gaussdb$# raise info 'next is %',v.next(1); gaussdb$# END; gaussdb$# / INFO: next is 2 ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR(); gaussdb-# BEGIN gaussdb$# raise info 'next is %',v.next(1); gaussdb$# END; gaussdb$# / INFO: next is <NULL> ANONYMOUS BLOCK EXECUTE -- 访问越界 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc','qwe'); gaussdb-# BEGIN gaussdb$# raise info 'next is %',v.next(10); gaussdb$# END; gaussdb$# / INFO: next is <NULL> ANONYMOUS BLOCK EXECUTE
- exists(idx)
返回值:true or false,BOOLEAN类型
功能描述:查找指定位置是否存在有效元素。
示例:
gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR('asd','zxc'); gaussdb-# flag bool; gaussdb-# BEGIN gaussdb$# flag := v.exists(1); gaussdb$# raise info '%',flag; gaussdb$# flag := v.exists(3); gaussdb$# raise info '%',flag; gaussdb$# flag := v.exists(7); gaussdb$# raise info '%',flag; gaussdb$# END; gaussdb$# / INFO: t INFO: f INFO: f ANONYMOUS BLOCK EXECUTE -- 数组未初始化 gaussdb=# DECLARE gaussdb-# TYPE VARR IS VARRAY(10) OF varchar(3); gaussdb-# v VARR := VARR(); gaussdb-# flag bool; gaussdb-# BEGIN gaussdb$# flag := v.exists(1); gaussdb$# raise info '%',flag; gaussdb$# flag := v.exists(3); gaussdb$# raise info '%',flag; gaussdb$# flag := v.exists(7); gaussdb$# raise info '%',flag; gaussdb$# END; gaussdb$# / INFO: f INFO: f INFO: f ANONYMOUS BLOCK EXECUTE
- count, extend, trim, delete, first, last, next, prior函数应用在未初始化的数组时,开启参数会报Reference to uninitialized collection的错误,未开启则不报错。
- 对于extend(count)和extend(count, idx)函数:超过数组定义大小时,开启参数后会报Subscript outside of limit的错误,未开启则不报错。
- 对于extend(count, idx)函数:下标不合法时开启参数后会报Subscript outside of limit或者Subscript outside of count的错误,未开启参数时报wrong number of array subscripts的错误。
- 对于trim(n)函数:当n大于数组元素个数时,开启参数后会报Subscript outside of count的错误,未开启则不报错。
- 对于delete(idx)函数:下标idx不合法时开启参数后会报Subscript outside of limit或者Subscript outside of count的错误,未开启参数时返回原数组。