更新时间:2024-05-07 GMT+08:00

数组支持的函数

在内层表达式中,不支持通过嵌套的方式调用数组类型函数。

  • extend[(count[, idx])]

    参数:idx和count为int4类型。

    返回值:无返回值

    功能描述:在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)]

    参数:n为int4类型。

    返回值:无返回值

    功能描述:无参数时,删除数组末尾一个元素空间,输入参数合法时,删除数组末尾指定数量元素空间。

    示例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)

    参数:int4类型

    返回值:无返回值

    功能描述:删除数组中某个位置的元素。

    示例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类型

    返回值: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类型

    返回值: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)

    参数:int4类型

    返回值: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

以下说明描述了数组类型函数在开启GUC参数varray_compat前后的差异行为:
  • 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的错误,未开启参数时返回原数组。