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