华为云云数据库GaussDB数组支持的函数_云淘科技

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 
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 
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 
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 
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 
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的错误,未开启参数时返回原数组。

父主题: 数组

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家