• GaussDB(DWS)自定义函数返回多结果集


    在使用GaussDB(DWS)过程中经常会创建自定义函数,总结了多结果集返回的使用方法。

    1.建表

    postgres=> create table test_tb_01(id integer,name varchar);
    
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.
    
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    
    CREATE TABLE
    
    postgres=> insert into test_tb_01 values(generate_series(1,5),'aa');
    
    INSERT 0 5 
    
    

    2.返回单列多行

    • 使用return next variable:
    create or replace function test_func_01()
    
    return setof varchar
    
    as
    
    out_name varchar;
    
    begin
    
        for out_name in select name from test_tb_01 loop
    
           return next out_name;
    
        end loop;
    
    end;
    /
    
    
    postgres=> select test_func_01();
    
     test_func_01
    
    --------------
     aa
    
     aa
    
     aa
    
     aa
    
     aa
    
    (5 rows)
    
    
    • 指定out参数,使用return next:
    create or replace function test_func_02(out out_name varchar)
    
    return setof varchar
    
    as
    
    v_rec RECORD;
    
    begin
    
        for v_rec in select * from test_tb_01 loop
    
           out_name := v_rec.name;
    
           return next;
    
        end loop;
    
    end;
    
    /
    
     
    
    postgres=> select test_func_02();
    
     test_func_02
    
    --------------
    
     aa
    
     aa
    
     aa
    
     aa
    
     aa
    
    (5 rows)
    
    • 使用return query:
    create or replace function test_func_03()
    
    return setof varchar
    
    as
    
    begin
    
        return query(select name from test_tb_01);
    
    end;
    
    /
    
     
    
    postgres=> select test_func_03();
    
     test_func_03
    
    --------------
    
     aa
    
     aa
    
     aa
    
     aa
    
     aa
    
    (5 rows)
    

    3.返回多列的多行

    • 使用return next variable:
    create or replace function test_func_04()
    
    RETURN SETOF RECORD as
    
    declare
    
        v_rec record;
    
    begin
    
        for v_rec in select * from test_tb_01 loop
    
           return next v_rec;
    
        end loop;
    
    end;
    
    /
    

    自定义函数test_func_04的调用,需要注意如下问题:

    postgres=> select test_func_04();
    
    ERROR:  Set-valued function called in context that cannot accept a set when init tuple store for RETURN NEXT/RETURN QUERY.
    
    CONTEXT:  PL/pgSQL function test_func_04() line 6 at RETURN NEXT
    
    referenced column: test_func_04
    
    postgres=> select * from test_func_04();
    
    ERROR:  a column definition list is required for functions returning "record"
    
    LINE 1: select * from test_func_04();
    

    需要使用as子句来处理结果集

    postgres=> select  * from test_func_04() as t(id integer,name varchar);
    
     id | name
    
    ----+------
    
      1 | aa
    
      2 | aa
    
      3 | aa
    
      4 | aa
    
      5 | aa
    
    (5 rows)
    

    指定out参数就不会有问题,如下test_func_05所示:

    • 指定out参数,使用return next:
    create or replace function test_func_05(out out_id integer,out out_name varchar)
    
    return setof record as
    
    declare
    
        v_rec record;
    
    begin
    
        for v_rec in select * from test_tb_01 loop
    
           out_id := v_rec.id;
    
           out_name := v_rec.name;
    
           return next;
    
        end loop;
    
    end;
    
    /
    
     
    
    postgres=> select * from test_func_05();
    
     id | name
    
    ----+------
    
      1 | aa
    
      2 | aa
    
      3 | aa
    
      4 | aa
    
      5 | aa
    
    (5 rows)
    
    • 使用return query:
    create or replace function test_func_06()
    
    return setof record as
    
    begin
    
       return query(select id,name from test_tb_01);
    
    end;
    
    /
    
     
    
    postgres=> select * from test_func_06() as t(id integer,name varchar);
    
     id | name
    
    ----+------
    
      1 | aa
    
      2 | aa
    
      3 | aa
    
      4 | aa
    
      5 | aa
    
    (5 rows)
    
    

    from: https://bbs.huaweicloud.com/blogs/205964

  • 相关阅读:
    Nginx下载服务器配置文件
    php7连接mysql测试代码
    Vagrant 构建 Linux 开发环境
    清理buffer/cache/swap的方法梳理
    【12】
    python全栈目录
    Chrome启动后打开第一个网页很慢的解决方案
    Pycharm快捷键
    TEst
    1、Linux命令随笔
  • 原文地址:https://www.cnblogs.com/hankleo/p/14966976.html
Copyright © 2020-2023  润新知