各位用户为了找寻关于PostgreSQL function返回多行的操作的资料费劲了很多周折。这里教程网为您整理了关于PostgreSQL function返回多行的操作的相关资料,仅供查阅,以下为您介绍关于PostgreSQL function返回多行的操作的详细内容

1. 建表

? 1 2 3 4 5 postgres=# create table tb1(id integer,name character varying); CREATE TABLE postgres=# postgres=# insert into tb1 select generate_series(1,5),'aa'; INSERT 0 5

2. 返回单字段的多行(returns setof datatype)

不指定out参数,使用return next xx:

? 1 2 3 4 5 6 7 8 9 10 create or replace function func01()returns setof character varying as $$ declare n character varying; begin  for i in 1..5 loop  select name into n from tb1 where id=i;  return next n;  end loop; end $$ language plpgsql;

指定out参数,使用return next:

? 1 2 3 4 5 6 7 8 create or replace function func02(out character varying)returns setof character varying as $$ begin  for i in 1..5 loop  select name into $1from tb1 where id=i;  return next;  end loop; end $$ language plpgsql;

使用return query:

? 1 2 3 4 5 6 7 create or replace function func03()returns setof character varying as $$ begin  for i in 1..5 loop  return query(select name from tb1 where id=i);  end loop; end $$language plpgsql;

3. 返回多列的多行(returns setog record)

不指定out参数,使用return next xx:

? 1 2 3 4 5 6 7 8 9 10 create or replace function func04()RETURNS SETOF RECORD as $$ declare  r record; begin  for i in 1..5 loop  select * into r from tb1 where id=i;  return next r;  end loop; end; $$language plpgsql;

在使用func04的时候注意,碰到问题列下:

 

问题一:

? 1 2 3 postgres=# select func04(); ERROR: set-valued function called in context that cannot accept a set CONTEXT: PL/pgSQL function func04() line 7 at RETURN NEXT

解决:

? 1 If you call your set-returning function the wrong way (IOW the way you might normally call a function), you will get this error message: Set-valued function called in context that cannot accept a set. Incorrect: select sr_func(arg1, arg2, …); Correct: select * from sr_func(arg1, arg2, …);

问题二:

? 1 2 3 postgres=# select * from func04(); ERROR: a column definition list is required for functions returning "record" LINE 1: select * from func04();

解决:

? 1 2 3 4 5 6 7 8 9 postgres=# select * from func04() as t(id integer,name character varying);  id | name ----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa (5 rows)

这个问题在func04如果指定out参数就不会有问题,如下func05所示:

指定out参数,使用return next:

? 1 2 3 4 5 6 7 8 9 10 11 12 create or replace function func05(out out_id integer,out out_name character varying)returns setof record as $$ declare  r record; begin  for i in 1..5 loop  select * into r from tb1 where id=i;  out_id:=r.id;  out_name:=r.name;  return next;  end loop; end; $$language plpgsql; ? 1 2 3 4 5 6 7 8 9 postgres=# select * from func05();  id | name ----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa (5 rows)

使用return query:

? 1 2 3 4 5 6 7 create or replace function func06()returns setof record as $$ begin  for i in 1..5 loop  return query(select id,name from tb1 where id=i);  end loop; end; $$language plpgsql; ? 1 2 3 4 5 6 7 8 9 postgres=# select * from func06() as t(id integer,name character varying);  id | name ----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa (5 rows)

补充:Postgresql - plpgsql - 从Function中查询并返回多行结果

通过plpgsql查询表,并返回多行的结果。

关于创建实验表插入数据这里就不说啦

返回查询结果

? 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 mytest=# create or replace function test_0830_5() returns setof test mytest-# as $$ mytest$# DECLARE mytest$# r test%rowtype; -- 将 mytest$# BEGIN mytest$# FOR r IN mytest$# SELECT * FROM test WHERE id > 0 mytest$# LOOP mytest$# RETURN NEXT r; mytest$# END LOOP; mytest$# RETURN; mytest$# END mytest$# $$ language plpgsql; CREATE FUNCTION   mytest=# select test_0830_5(1); test_0830_5 ------------------------------------------ (2,abcabc,"2018-08-30 09:26:14.392187") ...... (11,abcabc,"2018-08-30 09:26:14.392187") (10 rows)   mytest=# select * from test_0830_5(); id | col1 | col2 ----+--------+---------------------------- 2 | abcabc | 2018-08-30 09:26:14.392187 ...... 11 | abcabc | 2018-08-30 09:26:14.392187 (10 rows)

返回某列

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 mytest=# CREATE OR REPLACE FUNCTION test_0830_6(date) RETURNS SETOF integer AS $$ mytest$# BEGIN mytest$# RETURN QUERY SELECT id mytest$# FROM test mytest$# WHERE col2 >= $1 mytest$# AND col2 < ($1 + 1); mytest$# IF NOT FOUND THEN mytest$# RAISE EXCEPTION 'No id at %.', $1; mytest$# END IF; mytest$# RETURN; mytest$# END mytest$# $$ mytest-# LANGUAGE plpgsql; CREATE FUNCTION mytest=# select test_0830_6('2018-08-30'); test_0830_6 ------------- 2 ...... 11 (10 rows)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/luojinbai/article/details/45487373