数组支持的函数
- 以下几点说明描述了数组类型函数在开启GUC参数varray_compat前后的差异行为:
- count、extend、trim、delete、first、last、next和prior函数应用在未初始化的数组即数组为NULL时,开启参数会报Reference to uninitialized collection的错误,未开启则不报错。
- 对于extend(count)函数和extend(count, idx)函数:count加上数组现有元素个数超过数组定义大小时,开启参数后会报Subscript outside of limit的错误,未开启则不报错。
- 对于extend(count, idx)函数:下标idx不合法时开启参数后会报Subscript outside of limit或者Subscript beyond count的错误。
- 对于trim(n)函数:当n大于数组元素个数时,开启参数后会报Subscript beyond count的错误,未开启则不报错。
- 对于delete(idx)函数:下标idx不合法时开启参数后会报Subscript outside of limit或者Subscript beyond count的错误,未开启参数时返回原数组。
- 以下示例为A兼容模式下的示例,函数定义说明里[]中的内容代表可选项,如count[()]表示可以写成count或count()。
- 如在执行以下示例时遇到报错Cannot change the guc status while in the same session时,需要切换session后重新执行。
- 在内层表达式中,不支持通过嵌套的方式调用数组类型函数。
- extend[([count])]
返回值:无返回值。
功能描述:在varray变量末尾拓展1个或count个元素,元素默认扩展为NULL。
示例1:extend,扩展1个元素,默认扩展为NULL。
gaussdb=# set behavior_compat_options = ''; 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; gaussdb$# dbe_output.print_line(arrint.count); gaussdb$# end; gaussdb$# / 0 1 ANONYMOUS BLOCK EXECUTE
示例2:extend(count),扩展count个元素,默认扩展为NULL。
gaussdb=# set behavior_compat_options = ''; 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$# end; gaussdb$# / 0 3 ANONYMOUS BLOCK EXECUTE
示例3:开启varray_compat参数时,extend后超过数组定义大小会报错。
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
示例4:开启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-# begin gaussdb$# arrint.extend(3); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at assignment
- extend(count, idx)
返回值:无返回值。
功能描述:在varray变量末尾拓展count个元素,并且扩展元素的值等于给定idx下标元素的值。该功能需要设置a_format_version值为10c和设置a_format_dev_version值为s1后才能使用。
示例1:extend(count, idx),扩展第idx位置的元素。
gaussdb=# set a_format_version='10c'; SET gaussdb=# set a_format_dev_version='s1'; SET gaussdb=# set behavior_compat_options = ''; 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
示例2:extend(count, idx),开启了varray_compat参数,且idx越界会报错。
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
示例3:extend(count, 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; gaussdb-# begin gaussdb$# arrint.extend(10, 1); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at assignment
- count[()]
返回值:int4类型。
功能描述:返回数组中的元素个数。
示例1:查看已初始化的数组元素个数。
gaussdb=# set behavior_compat_options = ''; SET 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)]
返回值:无返回值。
功能描述:无参数时,删除数组末尾一个元素空间,给定参数n时,删除数组末尾指定数量元素空间。
示例1:删除数组中的n个元素,未开启参数varray_compat。
gaussdb=# set behavior_compat_options = ''; 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.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$# dbe_output.print_line(arrint.count); gaussdb$# end; gaussdb$# / 3 0 ANONYMOUS BLOCK EXECUTE
示例2:删除数组中的n个元素,且n大于数组元素个数,未开启参数varray_compat。
-- n大于数组元素个数,清空数组元素 gaussdb=# set behavior_compat_options = ''; 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.trim(4); gaussdb$# dbe_output.print_line(arrint.count); gaussdb$# end; gaussdb$# / 3 0 ANONYMOUS BLOCK EXECUTE
示例3:删除数组中的n个元素,且n大于数组元素个数,同时打开varray_compat参数。
-- n大于数组元素个数时会报错 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); -- count > 0. gaussdb$# arrint.trim(4); gaussdb$# end; gaussdb$# / 3 ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 6 at assignment -- 数组未初始化报错 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.trim(1); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/SQL function inline_code_block line 5 at assignment
示例4:数组未初始化,同时打开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-# 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=# set behavior_compat_options = ''; 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=# 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)
返回值:无返回值。
功能描述:给定下标idx在数组范围内,则删除数组中给定下标idx的元素。
示例1:给定idx下标在数组范围内。
gaussdb=# set behavior_compat_options = ''; 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(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。
-- 未开参数varray_compat gaussdb=# set behavior_compat_options = ''; 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(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=# 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(4); gaussdb$# raise info '%', arrint; gaussdb$# end; gaussdb$# / 3 ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 6 at assignment 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(11); gaussdb$# raise info '%', arrint; gaussdb$# end; gaussdb$# / 3 ERROR: Subscript outside of limit CONTEXT: PL/SQL function inline_code_block line 6 at assignment
示例3:给定idx下标在数组范围外,开启参数varray_compat。
-- 开启参数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(4); gaussdb$# raise info '%', arrint; gaussdb$# end; gaussdb$# / 3 ERROR: Subscript beyond count CONTEXT: PL/SQL function inline_code_block line 6 at assignment 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(11); gaussdb$# raise info '%', arrint; gaussdb$# end; gaussdb$# / 3 ERROR: Subscript outside of limit CONTEXT: PL/SQL function inline_code_block line 6 at assignment
示例4:开启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-# begin gaussdb$# arrint.delete(2); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at assignment
- first[()]
返回值:int4类型。
功能描述:返回数组中第一个元素的下标,若没有第一个元素,则返回NULL。
示例:
gaussdb=# set behavior_compat_options = ''; SET 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 -- 数组未初始化返回NULL gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'first is %',v.first; gaussdb$# end; gaussdb$# / INFO: first is <NULL> ANONYMOUS BLOCK EXECUTE -- 开启varray_copmat参数后,数组未初始化报错 gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'first is %',v.first; gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
- last[()]
返回值:int4类型。
功能描述:返回数组中最后一个元素的下标。若没有最后一个元素,则返回NULL。
示例1:
gaussdb=# set behavior_compat_options = ''; SET 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 -- 数组未初始化返回NULL gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'last is %',v.last; gaussdb$# end; gaussdb$# / INFO: last is <NULL> ANONYMOUS BLOCK EXECUTE -- 开启varray_copmat参数后,数组未初始化报错 gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'first is %',v.last; gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
- prior(idx)
返回值:int4类型。
功能描述:返回数组中指定下标的前一个元素下标,若无法找到对应元素下标则返回NULL。
示例:
gaussdb=# set behavior_compat_options = ''; SET 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('asd','zxc','qwe'); gaussdb-# begin gaussdb$# raise info 'prior is %',v.prior(10); gaussdb$# end; gaussdb$# / INFO: prior is 3 ANONYMOUS BLOCK EXECUTE -- 开启varray_copmat参数后,数组未初始化报错 gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'prior is %',v.prior(2); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
- next(idx)
返回值:int4类型。
功能描述:返回数组中指定下标的后一个元素下标,若无法找到对应元素下标则返回NULL。
示例:
gaussdb=# set behavior_compat_options = ''; SET 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('asd','zxc','qwe'); gaussdb-# begin gaussdb$# raise info 'next is %',v.next(10); gaussdb$# end; gaussdb$# / INFO: next is <NULL> ANONYMOUS BLOCK EXECUTE -- 开启varray_copmat参数后,数组未初始化报错 gaussdb=# set behavior_compat_options = 'varray_compat'; SET gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v varr; gaussdb-# begin gaussdb$# raise info 'next is %',v.next(1); gaussdb$# end; gaussdb$# / ERROR: Reference to uninitialized collection CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
- exists(idx)
返回值:true或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 -- 数组未初始化返回false gaussdb=# declare gaussdb-# type varr is varray(10) of varchar(3); gaussdb-# v 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