更新时间:2026-10-21 GMT+08:00
分享

集合支持的函数

集合操作符

  • =

    参数:nesttable类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:判断两个集合是否相等。

    示例:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT
     a nest := nest(1,2);
     b nest := nest(1,2);
     flag BOOL;
     BEGIN
        flag := a = b;
        RAISE INFO '%', flag;
    END;
     /
    INFO:  t
    ANONYMOUS BLOCK EXECUTE
  • <>

    参数:nesttable类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:判断两个集合是否不相等。

    示例:

    gaussdb=# DECLARE
      TYPE nest IS TABLE OF INT;
      a nest := nest(1,2);
      b nest := nest(1,2);
      flag BOOL; 
     BEGIN
       flag := a <> b;
       RAISE INFO '%', flag;
    END;
    /
    INFO:  f
    ANONYMOUS BLOCK EXECUTE
  • IS [NOT] NULL

    参数:nesttable类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:IS NULL判断一个集合是否为NULL,IS NOT NULL判断一个集合是否为非NULL。

    示例:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest;
       b nest := NULL;
       c nest := nest(1,2);
       flag BOOL; 
    BEGIN
        flag := a IS NULL;
        RAISE INFO '%', flag;
        flag := b IS NULL;
        RAISE INFO '%', flag;
        flag := c IS NULL;
        RAISE INFO '%', flag;
     END;
     /
    INFO:  t
    INFO:  t
    INFO:  f
    ANONYMOUS BLOCK EXECUTE
    
    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest;
       b nest := NULL;
       c nest := nest(1,2);
       flag BOOL; 
    BEGIN
        flag := a IS NOT NULL;
        RAISE INFO '%', flag;
        flag := b IS NOT NULL;
        RAISE INFO '%', flag;
        flag := c IS NOT NULL;
        RAISE INFO '%', flag;
     END;
     /
    INFO:  f
    INFO:  f
    INFO:  t
    ANONYMOUS BLOCK EXECUTE
  • ^=

    参数:nesttable类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:判断两个集合是否不相等。

    示例:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2);
       b nest := nest(1,2);
       flag BOOL; 
     BEGIN
       flag := a ^= b;
       RAISE INFO '%', flag;
     END;
     /
    INFO:  f
    ANONYMOUS BLOCK EXECUTE
  • [NOT] IN

    参数:nesttable类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:判断一个集合是否在集合列表中。

    示例:

    gaussdb=# DECLARE
       TYPE tab IS TABLE OF VARCHAR(10);
       tmp1 tab := tab('a', 'b');
       tmp2 tab := tab('a', 'b');
       flag BOOL; 
     BEGIN
       flag := tmp2 in (tmp1);
       RAISE INFO '%', flag;
     END;
     /
    INFO:  t
    ANONYMOUS BLOCK EXECUTE

集合MULTISET函数

  • MULTISET UNION [ALL | DISTINCT]

    参数:nesttable类型。

    返回值:nesttable类型。

    功能描述:两个集合变量的并集,ALL表示不去除重复元素,DISTINCT表示去除重复元素,ALL为默认值。

    示例1,求两个集合变量的并集,且不去除重复元素,即MULTISET UNION ALL:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2);
       b nest := nest(2,3);
     BEGIN
       a := a MULTISET UNION ALL b;
       RAISE INFO '%', a;
     end;
     /
    INFO:  {1,2,2,3}
    ANONYMOUS BLOCK EXECUTE

    示例2,求两个集合变量的并集,且去除重复元素,即MULTISET UNION DISTINCT:

    gaussdb=# DECLARE
        TYPE nest IS TABLE OF INT;
        a nest := nest(1,2);
        b nest := nest(2,3);
     BEGIN
        a := a MULTISET UNION DISTINCT b;
        RAISE INFO '%', a;
     END;
     /
    INFO:  {1,2,3}
    ANONYMOUS BLOCK EXECUTE
  • MULTISET EXCEPT [ALL | DISTINCT]

    参数:nesttable类型。

    返回值:nesttable类型。

    功能描述:两个集合变量的差集。如A MULTISET EXCEPT B:ALL表示去除A中A具有的元素且B也具有的元素并返回,其中去除动作计算元素个数。例如,对于特定元素,如果A中出现了m次,B中出现了n次,当 m > n时,则去除A中m - n个该元素,当m <= n时,则去除A中m个该元素;DISTINCT表示去除A中A具有的元素且B也具有的元素并返回,其中去除动作不计算元素个数。对于特定元素,如果在A中出现且又在B中出现了,则去除A中所有该元素。ALL为默认值。

    示例1,求两个集合变量的差集,去除A中A具有的元素且B也具有的元素并返回,其中去除动作计算元素个数。即MULTISET EXCEPT ALL:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,2);
       b nest := nest(2,3);
     BEGIN
       a := a MULTISET EXCEPT ALL b;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1,2}
    ANONYMOUS BLOCK EXECUTE

    示例2,求两个集合变量的差集,去除A中A具有的元素且B也具有的元素并返回,其中去除动作不计算元素个数。即MULTISET EXCEPT DISTINCT:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,2);
       b nest := nest(2,3);
     BEGIN
       a := a MULTISET EXCEPT DISTINCT b;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1}
    ANONYMOUS BLOCK EXECUTE
  • MULTISET INTERSECT [ALL | DISTINCT]

    参数:nesttable类型。

    返回值:nesttable类型。

    功能描述:两个集合变量的交集。如 A MULTISET INTERSECT B:ALL表示保留所有重复元素(包括多次重复的元素);DISTINCT表示返回唯一值交集,去除重复元素。ALL为默认值。

    示例1,求两个集合变量的交集,不去除重复元素,即MULTISET INTERSECT ALL:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,2);
       b nest := nest(2,2,3);
     BEGIN
       a := a MULTISET INTERSECT ALL b;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {2,2}
    ANONYMOUS BLOCK EXECUTE

    示例2,求两个集合变量的交集,去除重复元素,即MULTISET INTERSECT DISTINCT:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,2);
       b nest := nest(2,2,3);
     BEGIN
       a := a MULTISET INTERSECT DISTINCT b;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {2}
    ANONYMOUS BLOCK EXECUTE

集合类型函数

  • 以下函数定义说明里[]中的内容代表可选项,如count[()]表示可以写成count或count()。
  • 在内层表达式中,不支持通过嵌套的方式调用集合类型函数。
  • 当类型嵌套且集合类型作为内部类型时,无参的extend、delete、trim函数只支持extend、delete、trim形式调用,不支持extend()、delete()、trim()形式调用。
  • exists(idx)

    参数:idx为INT4类型或VARCHAR类型。

    返回值:TRUE或FALSE,BOOLEAN类型。

    功能描述:查找指定位置是否存在有效元素。

    示例:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF VARCHAR2;
       a nest := nest('happy','?');
       flag BOOL;
     BEGIN
       flag := a.EXISTS(1);
       RAISE INFO '%', flag;
       flag := a.EXISTS(10);
       RAISE INFO '%', flag;
     END;
     /
    INFO:  t
    INFO:  f
    ANONYMOUS BLOCK EXECUTE
    gaussdb=# DECLARE
       TYPE nest IS TABLE OF VARCHAR2 INDEX BY VARCHAR2;
       a nest;
       flag BOOL;
     BEGIN
       a('1') := 'Be';
       a('2') := 'happy';
       a('3') := '.';
       flag := a.EXISTS('1');
       RAISE INFO '%', flag;
       flag := a.EXISTS('ddd');
       RAISE INFO '%', flag;
     END;
     /
    INFO:  t
    INFO:  f
    ANONYMOUS BLOCK EXECUTE
  • extend[(count[, idx])]

    参数:idx和count为INT4类型,没有参数传入时扩展1个元素值为NULL。

    返回值:无返回值。

    功能描述:extend函数仅支持nesttable类型变量使用。在nesttable变量末尾拓展1个或count个元素。存在idx下标元素时,复制count个idx下标元素到变量末尾。

    示例1,nesttable类型变量扩展1个元素且所扩展的元素值为NULL:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1);
     BEGIN
       RAISE INFO '%', a;
       a.EXTEND;
       RAISE INFO '%', a;
       a.EXTEND;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1}
    INFO:  {1,NULL}
    INFO:  {1,NULL,NULL}
    ANONYMOUS BLOCK EXECUTE

    示例2,nesttable类型变量扩展n个元素且所扩展的元素值为NULL:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1);
     BEGIN
       RAISE INFO '%', a;
       a.EXTEND(2);
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1}
    INFO:  {1,NULL,NULL}
    ANONYMOUS BLOCK EXECUTE

    示例3,nesttable类型变量扩展n个元素且所扩展的元素值为指定下标元素的值:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(9);
     BEGIN
       RAISE INFO '%', a;
       a.EXTEND(2,1);
       RAISE INFO '%', a;
     END;
     /
    INFO:  {9}
    INFO:  {9,9,9}
    ANONYMOUS BLOCK EXECUTE
  • delete[(idx1[, idx2])]

    参数:idx1和idx2为INT4类型或VARCHAR2类型。

    返回值:无返回值。

    功能描述:无参数时,无索引集合nesttable类型变量删除集合类型的所有元素和空间,后续使用需要重新扩展空间,带索引集合indexbytable类型变量删除所有元素内容;一个参数删除指定位置元素(不删除空间);两个参数则删除下标区间内的所有元素(不删除空间)。

    约束:对于无索引集合nesttable类型来说,删除元素而没删除空间,会使该空间处于无效状态,可继续赋值。作为函数返回值或自治事务入参时,会删除无效成员的存储空间,所有成员的下标会相应发生改变。

    示例1,无索引集合nesttable类型变量删除集合类型的所有元素和空间:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,3,4,5);
     BEGIN
       RAISE INFO '%', a;
       a.DELETE();
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1,2,3,4,5}
    INFO:  {}
    ANONYMOUS BLOCK EXECUTE

    示例2,无索引集合nesttable类型变量删除指定位置元素:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,3,4,5);
     BEGIN
       RAISE INFO '%', a;
       a.DELETE(3);
       RAISE INFO '%', a;
       a(3) := 3;
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1,2,3,4,5}
    INFO:  {1,2,4,5}
    INFO:  {1,2,3,4,5}
    ANONYMOUS BLOCK EXECUTE

    示例3,无索引集合nesttable类型变量删除指定区间元素:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       a nest := nest(1,2,3,4,5);
     BEGIN
       RAISE INFO '%', a;
       a.DELETE(2,4);
       RAISE INFO '%', a(1);
       RAISE INFO '%', a(5);
       RAISE INFO '%', a;
     END;
     /
    INFO:  {1,2,3,4,5}
    INFO:  1
    INFO:  5
    INFO:  {1,5}
    ANONYMOUS BLOCK EXECUTE

    示例4,带索引集合indexbytable类型变量删除集合类型的所有元素和空间:

    gaussdb=# DECLARE
       TYPE t1 IS TABLE OF INT INDEX BY VARCHAR;
       v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
     BEGIN
       v.DELETE();
       RAISE INFO '%', v.COUNT();
     END;
     /
    INFO:  0
    ANONYMOUS BLOCK EXECUTE

    示例5,带索引集合indexbytable类型变量删除指定位置元素:

    gaussdb=# declare
       type t1 is table of int index by varchar;
       v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
     begin
       raise info '%', v('a');
       v.delete('a');
       raise info '%', v('a');
     end;
     /
    INFO:  1
    ERROR:  no data found
    CONTEXT:  PL/pgSQL function inline_code_block line 6 at RAISE

    示例6,带索引集合indexbytable类型变量删除指定区间元素:

    gaussdb=# declare
       type t1 is table of int index by varchar;
       v t1 := t1('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
     begin
       raise info '%', v('b');
       v.delete('a', 'c');
       raise info '%', v('b');
     end;
     /
    INFO:  2
    ERROR:  no data found
    CONTEXT:  PL/pgSQL function inline_code_block line 6 at RAISE
  • trim[(n)]

    参数:n为INT4类型。

    返回值:无返回值。

    功能描述:trim函数仅支持nesttable类型变量使用。无参数时,删除末尾一个元素空间,输入参数合法时,删除末尾指定数量元素空间。

    示例:

    gaussdb=# DECLARE
       TYPE nest IS TABLE OF INT;
       aa nest := nest(11,22,33,44,55);
     BEGIN
       RAISE INFO 'aa:%' ,aa;
       aa.TRIM;  -- 无参数
       RAISE INFO 'aa:%' ,aa;
       aa.TRIM();  -- 无参数
       RAISE INFO 'aa:%' ,aa;
       aa.TRIM(2);  -- 参数合法
       RAISE INFO 'aa:%' ,aa;
       aa.TRIM(2);  -- 集合元素空间不足2, 参数不合法报错
     END;
     /
    INFO:  aa:{11,22,33,44,55}
    INFO:  aa:{11,22,33,44}
    INFO:  aa:{11,22,33}
    INFO:  aa:{11}
    ERROR:  Subscript beyond count
    CONTEXT:  PL/pgSQL function inline_code_block line 11 at assignment
  • count[()]

    参数:无。

    返回值:INT类型。

    功能描述:返回集合中存在有效元素的个数。

    示例1,无索引集合类型变量使用count函数:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'count:%' ,aa.COUNT;
     aa.DELETE(3);  -- 删除一个元素,下标为3的元素无效
     RAISE INFO 'count:%' ,aa.COUNT();
     END;
     /
    INFO:  count:5
    INFO:  count:4
    ANONYMOUS BLOCK EXECUTE

    示例2,带索引集合类型变量使用count函数:

    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY INT;
     aa t1;
     BEGIN
     aa(1) := 111;
     aa(2) := 222;
     aa(3) := 333;
     RAISE INFO 'count:%' ,aa.COUNT();
     END;
     /
    INFO:  count:3
    ANONYMOUS BLOCK EXECUTE
    
    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY INT;
     aa t1;
     BEGIN
     aa(1) := 111;
     aa(2) := 222;
     aa(3) := 333;
     RAISE INFO 'count:%' ,aa.COUNT();
     END;
     /
    INFO:  count:3
    ANONYMOUS BLOCK EXECUTE
  • first[()]

    参数:无。

    返回值:INT类型或VARCHAR类型。

    功能描述:返回集合中第一个有效元素的下标。

    示例1,无索引集合类型变量使用first函数:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'first:%' ,aa.FIRST();
     aa.DELETE(1);
     RAISE INFO 'first:%' ,aa.FIRST;  -- 下标1的元素无效,第一个有效元素下标为2
     END;
     /
    INFO:  first:1
    INFO:  first:2
    ANONYMOUS BLOCK EXECUTE

    示例2,带索引集合类型变量使用first函数:

    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY INT;
     aa t1;
     BEGIN
     aa(3) := 111;
     aa(2) := 222;
     aa(1) := 333;
     RAISE INFO 'first:%' ,aa.FIRST;
     END;
     /
    INFO:  first:1
    ANONYMOUS BLOCK EXECUTE
    
    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY VARCHAR;
     aa t1;
     BEGIN
     aa('aaa') := 111;
     aa('bbb') := 222;
     aa('ccc') := 333;
     RAISE INFO 'first:%' ,aa.FIRST;
     END;
     /
    INFO:  first:aaa
    ANONYMOUS BLOCK EXECUTE
  • last[()]

    参数:无。

    返回值:INT类型或VARCHAR类型。

    功能描述:返回集合中最后一个有效元素的下标。

    示例1,无索引集合类型变量使用last函数:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'last:%' ,aa.LAST;
     aa.DELETE(5);
     RAISE INFO 'last:%' ,aa.LAST();  -- 下标5的元素无效,最后一个有效元素下标为4
     END;
     /
    INFO:  last:5
    INFO:  last:4
    ANONYMOUS BLOCK EXECUTE

    示例2,带索引集合类型变量使用last函数:

    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY VARCHAR;
     aa t1;
     BEGIN
     aa(3) := 111;
     aa(2) := 222;
     aa(1) := 333;
     RAISE INFO 'last:%' ,aa.LAST();
     END;
     /
    INFO:  last:3
    ANONYMOUS BLOCK EXECUTE
    
    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY VARCHAR;
     aa t1;
     BEGIN
     aa(3) := 111;
     aa(2) := 222;
     aa(1) := 333;
     RAISE INFO 'last:%' ,aa.LAST();
     END;
     /
    INFO:  last:ccc
    ANONYMOUS BLOCK EXECUTE
  • prior(idx)

    参数:idx为int类型或varchar类型。

    返回值:int类型或varchar类型。

    功能描述:返回集合中给定下标的前一个有效元素下标,下标不存在返回集合中最后一个元素。

    示例1,无索引集合类型变量使用prior函数:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'prior:%' ,aa.PRIOR(3);
     END;
     /
    INFO:  prior:2
    ANONYMOUS BLOCK EXECUTE

    示例2,带索引集合类型变量使用prior函数:

    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY VARCHAR;
     aa t1;
     BEGIN
     aa('ccc') := 111;
     aa('bbb') := 222;
     aa('aaa') := 333;
     RAISE INFO 'prior:%' ,aa.PRIOR('bbb');
     RAISE INFO 'prior:%' ,aa.PRIOR('ddd');
     END;
     /
    INFO:  prior:aaa
    INFO:  prior:ccc
    ANONYMOUS BLOCK EXECUTE
  • next(idx)

    参数:idx为INT类型或VARCHAR类型,下标不存在返回集合中第一个元素。

    返回值:INT类型或VARCHAR类型。

    功能描述:返回集合中给定下标的后一个有效元素下标。

    示例1,无索引集合类型变量使用next函数:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'next:%' ,aa.NEXT(3);
     END;
     /
    INFO:  next:4
    ANONYMOUS BLOCK EXECUTE

    示例2,带索引集合类型变量使用next函数:

    gaussdb=# DECLARE
     TYPE t1 IS TABLE OF INT INDEX BY INT;
     aa t1;
    BEGIN
     aa(3) := 111;
     aa(2) := 222;
     aa(1) := 333;
     RAISE INFO 'next:%' ,aa.NEXT(2);
     RAISE INFO 'next:%' ,aa.NEXT(-999);
     END;
     /
    INFO:  next:3
    INFO:  next:1
    ANONYMOUS BLOCK EXECUTE
  • limit

    参数:无。

    返回值:NULL。

    功能描述:仅用于nesttable类型变量,且返回NULL值。

    示例:

    gaussdb=# DECLARE
     TYPE nest IS TABLE OF INT;
     aa nest:=nest(11,22,33,44,55);
     BEGIN
     RAISE INFO 'limit:%' ,aa.LIMIT;
     END;
     /
    INFO:  limit:<NULL>
    ANONYMOUS BLOCK EXECUTE

集合相关函数

  • unnest_table(anynesttable)或unnest(anynesttable)

    参数:任意无索引集合类型。

    描述:返回给定nesttable中所有有效元素的结果集,会返回多行数据。

    返回类型:setof anyelement。

    示例:

    -- 当集合的元素类型为record类型且有元素为NULL时,该元素不会被返回,而是会返回一个非NULL的record值,该record的所有列为NULL。
    gaussdb=# CREATE OR REPLACE p1()
    gaussdb-# AS
    gaussdb$#     TYPE t1 IS TABLE OF INT;
    gaussdb$#     v2 t1 := t1(NULL, 2, 3, 4, NULL);
    gaussdb$#     tmp INT;
    gaussdb$#     CURSOR c1 IS SELECT * FROM UNNEST_TABLE(v2);
    gaussdb$# BEGIN
    gaussdb$# OPEN c1;
    gaussdb$# FOR i IN 1 .. v2.COUNT LOOP
    gaussdb$#     FETCH c1 INTO tmp;
    gaussdb$#     IF tmp IS NULL THEN
    gaussdb$#         DBE_OUTPUT.PRINT_LINE(i || ': is null');
    gaussdb$#     ELSE
    gaussdb$#         DBE_OUTPUT.PRINT_LINE(i || ': ' || tmp);
    gaussdb$#     END IF;
    gaussdb$# END LOOP;
    gaussdb$# CLOSE c1;
    gaussdb$# END;
    gaussdb$# /
    CREATE PROCEDURE
    gaussdb=# CALL p1();
    1: is null
    2: 2
    3: 3
    4: 4
    5: is null
     p1 
    ----
    
    (1 row)
    gaussdb=# DROP PROCEDURE IS EXISTS p1();
    DROP PROCEDURE
    
    -- nesttable嵌套record类型示例
    gaussdb=# CREATE OR REPLACE PROCEDURE p1() IS
    gaussdb$#   TYPE rec IS RECORD(c1 INT, c2 INT);
    gaussdb$#   TYPE t1 IS TABLE OF rec;
    gaussdb$#   v t1 := t1(rec(1, 1), rec(2, NULL), rec(NULL, NULL), NULL);
    gaussdb$#   v2 t1 := t1();
    gaussdb$#   CURSOR cur IS SELECT * FROM UNNEST(v);
    gaussdb$# BEGIN
    gaussdb$#   v2.EXTEND(v.COUNT);
    gaussdb$#   OPEN cur;
    gaussdb$#   FOR i IN 1 .. v.COUNT LOOP
    gaussdb$#     FETCH cur INTO v2(i);
    gaussdb$#     RAISE INFO '%', v2(i);
    gaussdb$#   END LOOP;
    gaussdb$#   CLOSE cur;
    gaussdb$# END
    gaussdb$# /
    CREATE PROCEDURE
    gaussdb=# CALL p1();
    INFO:  (1,1)
    INFO:  (2,)
    INFO:  (,)
    INFO:  (,)
     p1 
    ----
    
    (1 row)
    gaussdb=# DROP PROCEDURE IF EXISTS p1();
    DROP PROCEDURE
    
  • unnest_table(anyindexbytable)或unnest(anyindexbytable)

    参数:任意带索引集合类型。

    描述:返回给定indexbytable中所有元素根据索引排序后的结果集,会返回多行数据。

    返回类型:setof anyelement

    约束:只支持INDEX BY INT类型。

    示例:

    -- 当集合的元素类型为record类型且有元素为NULL时,该元素不会被返回,而是会返回一个非NULL的record值,该record的所有列为NULL。
    gaussdb=# CREATE OR REPLACE PROCEDURE p1()
    gaussdb-# AS
    gaussdb$#     TYPE t1 IS TABLE OF INT INDEX BY INT;
    gaussdb$#     v2 t1 := t1(1=>1, -10=>(-10), 6=>6, 4=>NULL);
    gaussdb$#     tmp INT;
    gaussdb$#     CURSOR c1 IS SELECT * FROM UNNEST_TABLE(v2);
    gaussdb$# BEGIN
    gaussdb$# OPEN c1;
    gaussdb$# FOR i IN 1 .. v2.COUNT LOOP
    gaussdb$#     FETCH c1 INTO tmp;
    gaussdb$#     IF tmp IS NULL THEN
    gaussdb$#         DBE_OUTPUT.PRINT_LINE(i || ': is null');
    gaussdb$#     ELSE
    gaussdb$#         DBE_OUTPUT.PRINT_LINE(i || ': ' || tmp);
    gaussdb$#     END IF;
    gaussdb$# END LOOP;
    gaussdb$# CLOSE c1;
    gaussdb$# END;
    gaussdb$# /
    CREATE PROCEDURE
    gaussdb=# CALL p1();
    1: -10
    2: 1
    3: is null
    4: 6
     p1 
    ----
    
    (1 row)
    gaussdb=# DROP PROCEDURE IF EXISTS p1();
    DROP PROCEDURE
    
    -- index by table嵌套record类型示例
    gaussdb=# CREATE OR REPLACE PROCEDURE p1() IS
    gaussdb$#   TYPE rec IS RECORD(c1 INT, c2 INT);
    gaussdb$#   TYPE t1 IS TABLE OF rec INDEX BY INT;
    gaussdb$#   v t1 := t1(1 => rec(1, 1), 2 => rec(2, NULL), 3 => rec(NULL, NULL), 4 => NULL);
    gaussdb$#   v2 t1 := t1();
    gaussdb$#   CURSOR cur IS SELECT * FROM UNNEST(v);
    gaussdb$# BEGIN
    gaussdb$#   OPEN cur;
    gaussdb$#   FOR i IN 1 .. v.COUNT LOOP
    gaussdb$#     FETCH cur INTO v2(i);
    gaussdb$#     RAISE INFO '%', v2(i);
    gaussdb$#   END LOOP;
    gaussdb$#   CLOSE cur;
    gaussdb$# END;
    gaussdb$# /
    CREATE PROCEDURE
    gaussdb=# CALL p1();
    INFO:  (1,1)
    INFO:  (2,)
    INFO:  (,)
    INFO:  (,)
     p1 
    ----
    
    (1 row)
    gaussdb=# drop procedure if exists p1();
    DROP PROCEDURE
    

相关文档