数组支持的函数
- 以下示例为ORA兼容模式下的示例,函数定义说明里[]中的内容代表可选项,如count[()]表示可以写成count或count()。
- 暂不支持数组未初始化报错(An uninitialized collection is referenced)、数组下标越界报错(Subscript beyond count)、数组下标超限制报错(Subscript outside of limit)。
- 在内层表达式中,不支持通过嵌套的方式调用数组类型函数。
- extend(count)、delete(idx)和trim(n)函数的参数只支持单个常量或变量,不支持其他形式的参数,如函数调用、表达式等形式。
- 当类型嵌套且数组类型作为内部类型时,无参的extend、delete、trim函数只支持extend、delete、trim形式调用,不支持extend()、delete()、trim()形式调用。
- extend[(count)]
返回值:无返回值。
功能描述:在varray变量末尾拓展1个或count个元素,元素默认扩展为NULL。
示例1:extend,扩展1个元素,默认扩展为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; gaussdb$# DBE_OUTPUT.PRINT_LINE(arrint.COUNT); gaussdb$# END; gaussdb$# / 0 1 ANONYMOUS BLOCK EXECUTE示例2:extend(count),扩展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 - extend(count, idx)
返回值:无返回值。
功能描述:在varray变量末尾拓展count个元素,并且扩展元素的值等于给定idx下标元素的值。
示例: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
- count[()]
返回值:INT4类型。
功能描述:返回数组中的元素个数。
示例:查看已初始化的数组元素个数。
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
- trim[(n)]
返回值:无返回值。
功能描述:无参数时,删除数组末尾一个元素;给定输入参数n时,删除数组末尾指定数量元素。
示例:删除数组中的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(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
- delete[()]
返回值:无返回值。
功能描述:清空数组中的元素。
示例:清空数组中的元素。
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,数组元素均为NULL -- 数组未初始化 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
- delete(idx)
返回值:无返回值。
功能描述:给定下标idx在数组范围内,则删除数组中给定下标idx的元素。
示例1:给定idx下标在数组范围内。
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下标在数组范围外。
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 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
- first[()]
返回值:INT4类型。
功能描述:返回数组中第一个元素的下标,若没有第一个元素,则返回NULL。
示例:
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
- last[()]
返回值:INT4类型。
功能描述:返回数组中最后一个元素的下标。若没有最后一个元素,则返回NULL。
示例:
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
- prior(idx)
返回值:INT4类型。
功能描述:返回数组中指定下标的前一个元素下标,若无法找到对应元素下标则返回NULL。
示例:
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 -- 数组未初始化返回NULL 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$# / 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类型。
功能描述:返回数组中指定下标的后一个元素下标,若无法找到对应元素下标则返回NULL。
示例:
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 -- 数组未初始化返回NULL 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$# / 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或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