PostgreSQL: Function 返回结果集单列和多列的例子

今天有人问到在 PostgreSQL 函数中如何返回结果集的单列,返回结果集(多列)的方法很多,那么如何返回结果集的单列呢,做了下测试,具体步骤如下:

测试一: 返回多条记录(单列)

1.1 创建测试表并插入记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
skytf=> create table test_result1 (id integer,name varchar(32));  
CREATE TABLE
skytf=> create table test_result2 (id integer,name varchar(32));
CREATE TABLE
skytf=> insert into test_result1 select generate_series(1,10),'a';
INSERT 0 10
skytf=> insert into test_result2 select generate_series(1,10),'b';
INSERT 0 10

skytf=> select * From test_result1;
id | name
----+------
1 | a
2 | a
3 | a
4 | a
5 | a
6 | a
7 | a
8 | a
9 | a
10 | a
(10 rows)

skytf=> select * From test_result2;
id | name
----+------
1 | b
2 | b
3 | b
4 | b
5 | b
6 | b
7 | b
8 | b
9 | b
10 | b
(10 rows)

1.2 方法一:返回多条记录( 单列)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION skytf.func_test_result_single ( in_id integer)  
RETURNS SETOF varchar as
$$
DECLARE
v_name varchar;
BEGIN

for v_name in ( (select name from test_result1 where id = in_id) union (select name from test_result2 where id = in_id) )loop
RETURN NEXT v_name;
end loop;
return;
END;
$$
LANGUAGE PLPGSQL;

执行函数

1
2
3
4
5
6
skytf=> SELECT * FROM func_test_result_single(1) ;  
func_test_result_single
-------------------------
b
a
(2 rows)

1.3 方法二:使用 reutrn query 返回多条记录( 单列)

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION skytf.func_test_result_query_single ( in_id integer)  
RETURNS SETOF varchar as
$$
DECLARE
v_rec RECORD;
BEGIN

return query ( (select name from test_result1 where id = in_id) union (select name from test_result2 where id = in_id) );
return;
END;
$$
LANGUAGE PLPGSQL;

执行函数

1
2
3
4
5
6
skytf=> select func_test_result_query_single (1);  
func_test_result_query_single
-------------------------------
b
a
(2 rows)

备注: 在返回指定 SETOF varchar 返回 varchar 类型单个字段,接下来介绍下返回多条记录多列的场景。

测试二: 返回多条记录(多列)

2.1 使用游标和”RETURNS SETOF RECORD” 返回多条记录( 多列)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION skytf.func_test_result_muti ( in_id integer)  
RETURNS SETOF RECORD as
$$
DECLARE
v_rec RECORD;
BEGIN

for v_rec in ( (select id , name from test_result1 where id = in_id) union (select id , name from test_result2 where id = in_id) )loop
RETURN NEXT v_rec;
end loop;
return;
END;
$$
LANGUAGE PLPGSQL;

执行函数

1
2
3
4
5
6
skytf=> SELECT * FROM func_test_result_muti(1) t(id integer,name varchar);  
id | name
----+------
1 | a
1 | b
(2 rows)

2.2 使用 reutrn query 返回多条记录( 多列)

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION skytf.func_test_result_query ( in_id integer)  
RETURNS SETOF RECORD as
$$
DECLARE
v_rec RECORD;
BEGIN

return query ( (select id , name from test_result1 where id = in_id) union (select id , name from test_result2 where id = in_id) );
return;
END;
$$
LANGUAGE PLPGSQL;

执行函数

1
2
3
4
5
6
skytf=> SELECT * FROM func_test_result_query(1) t(id integer,name varchar);  
id | name
----+------
1 | a
1 | b
(2 rows)

2.3 使用 out 输出参数 返回多条记录( 多列)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FUNCTION skytf.func_test_result_out ( in_id integer,out o_id integer,out o_name varchar)  
RETURNS SETOF RECORD as
$$
DECLARE
v_rec RECORD;
BEGIN

for v_rec in ( (select id , name from test_result1 where id = in_id) union (select id , name from test_result2 where id = in_id) )loop
o_id := v_rec.id;
o_name := v_rec.name;
RETURN NEXT ;
end loop;
return;
END;
$$
LANGUAGE PLPGSQL;

执行函数

1
2
3
4
5
6
skytf=> select skytf.func_test_result_out(1);  
func_test_result_out
----------------------
(1,a)
(1,b)
(2 rows)

总结

以上只是为了演示 PostgreSQL 函数的语法给出简单的例子,生产过程中的 function 会复杂很多。

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/237872.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论