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

openGauss6.0也支持PIPELINED管道函数了,一起了解一下

174

openGauss6.0也支持PIPELINED管道函数了,一起了解一下

本来想简单的了解一下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)

总结

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论