暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss 6.0 也支持PIPELINED管道函数了,一起了解一下

openGauss 2024-12-10
205

本来想简单的了解一下PIPELINED管道函数功能,但是发现稍微深入研究一下,就有许多的东西可供我们学习,随便拿出一个功能点也足够写一篇文章,有点啰嗦。咱们就之切主题来说说openGauss6.0的PIPELINED管道函数。

如果对Oracle的管道函数有了解的话,可能知道它是通过关键字PIPELINED表明是一个oracle管道函数,而且oracle管道函数的返回值类型必须为集合。

在openGauss6.0中也支持了PIPELINED管道函数,具体是指定函数为可以返回行集合(可以是嵌套表或数组)的函数,用户可以像查询物理表一样查询函数或者将其赋值给集合变量。

管道函数定义

在openGauss6.0中的管道函数通过RETURNS SETOF来表明函数将返回一个集合,而不是单独一项, 定义如下:

    CREATE OR REPLACE FUNCTION fun_pipelined() RETURNS SETOF t1 AS $$
    DECLARE
    var_row t1%ROWTYPE;
    BEGIN
    RETURN QUERY select * from t1;
    END;
    $$
    language plpgsql;

    在上述的函数定义中,我们还看到RETURN QUERY,其实也是管道函数定义的一部分。当需要函数返回一个集合时,使用RETURN NEXT或者RETURN QUERY向结果集追加结果,然后继续执行函数的下一条语句。随着后续的RETURN NEXT或RETURN QUERY命令的执行,结果集中会有多个结果。函数执行完成后会一起返回所有结果。

    RETURN NEXT可用于标量和复合数据类型。

    RETURN QUERY有一种变体RETURN QUERY EXECUTE,后面还可以增加动态查询,通过USING向查询插入参数。

    调用方法

    1、使用TABLE调用管道函数,函数不存在入参时,可以省略入参

       SELECT * FROM TABLE(table_function_name(parameter_list));
      -- 或者(函数不存在入参)
       SELECT * FROM TABLE(table_function_name);

      2、可以像查询表一样的查询函数

         SELECT * FROM table_function_name(parameter_list);

        3、也可以使用call调用函数

          call table_function_name();

          案例演示

          RETURN QUERY返回行

          在这个用例中指定RETURN QUERY返回结果集

          创建测试用例表

            create table t1(id int,name varchar(100),address varchar(100));
            insert into t1 values (1,'wangwu','beijing');
            insert into t1 values (2,'zhaosi','tianjing');
            insert into t1 values (3,'zhangsan','nanjing');

            创建一个管道函数函数,返回t1表的数据。

              CREATE OR REPLACE FUNCTION fun_pipe_query() RETURNS SETOF t1 AS $$
              DECLARE
              var_row t1%ROWTYPE;
              BEGIN
              RETURN QUERY select * from t1 where id >1;
              END;
              $$
              language plpgsql;

              使用TABLE调用管道函数然后查看结果,在这里函数名称后面的扩后,如果在没有入参的情况下,是可以省略的。

                testdb=> select * from table(fun_pipe_query);
                id | name | address
                ----+----------+----------
                2 | zhaosi | tianjing
                3 | zhangsan | nanjing
                (2 rows)

                像查询表一样的查询函数,在这里需要注意括号不可以省略

                  testdb=> select * from fun_pipe_query();
                  id | name | address
                  ----+----------+----------
                  2 | zhaosi | tianjing
                  3 | zhangsan | nanjing
                  (2 rows)

                  call调用执行fun_pipe_query函数

                    testdb=> call fun_pipe_query();
                    id | name | address
                    ----+----------+----------
                    2 | zhaosi | tianjing
                    3 | zhangsan | nanjing
                    (2 rows)

                    RETURN NEXT返回行

                    在这个用例中指定RETURN NEXT返回结果集

                    创建一个管道函数函数

                      CREATE OR REPLACE FUNCTION fun_pipe_next() RETURNS SETOF t1 AS $$
                      DECLARE
                      var_row t1%ROWTYPE;
                      BEGIN
                      FOR var_row IN select * from t1
                      LOOP
                      RETURN NEXT var_row;
                      END LOOP;
                      RETURN;
                      END;
                      $$ LANGUAGE PLPGSQL;

                      执行fun_pipe_next函数

                        testdb=>  select * from fun_pipe_next();
                        id | name | address
                        ----+----------+----------
                        1 | wangwu | beijing
                        2 | zhaosi | tianjing
                        3 | zhangsan | nanjing
                        (3 rows)

                        在这里就只使用一种方法执行函数,其他方式在这里省略了。

                        RETURN NEXT返回复合数据类型

                        建立测试类型

                          create type typ_t1 is(name varchar(20),address varchar(100));

                          创建管道函数

                            CREATE OR REPLACE FUNCTION fun_pipe_next2() RETURNS SETOF typ_t1 AS $$
                            DECLARE
                            var_row typ_t1;
                            BEGIN
                            FOR i IN select * from t1
                            LOOP
                            var_row.name=upper(i.name);
                            var_row.address=i.address;
                            RETURN NEXT var_row;
                            END LOOP;
                            END;
                            $$ LANGUAGE PLPGSQL;

                            执行fun_pipe_next2函数

                              testdb=> select * from fun_pipe_next2();
                              name | address
                              ----------+----------
                              WANGWU | beijing
                              ZHAOSI | tianjing
                              ZHANGSAN | nanjing
                              (3 rows)

                              总结

                              在这篇文章我相信你可以知道了管道函数就是能够返回集合的函数,能够像查询表一样查询函数或者将其赋值。在文章中也通过几个测试用例演示一下具体定义方法及调用方法,应该可以让大家快速的理解管道函数的使用方法。


                              点击阅读原文跳转作者文章

                              文章转载自openGauss,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论