【问题标题】:how to return multiple row from multiple table in plpgsql?如何从plpgsql中的多个表中返回多行?
【发布时间】:2014-03-27 10:51:13
【问题描述】:
如何从 plpgsql 中的多个表返回多行,我试图从 2 个具有内连接的表中返回行?
这是我的代码
CREATE OR REPLACE FUNCTION library.getallbookwithcategory()
RETURNS SETOF library.book AS
$BODY$
DECLARE
r library.book%rowtype;
BEGIN
FOR r IN select book.*,category.name from library.book left join library.category on category.id=book.category_id
WHERE book.id > 0 order by dateadded ASC
LOOP
-- can do some processing here
RETURN NEXT r;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql
我需要从类别返回名称
【问题讨论】:
-
根据 some processing here 的确切含义,您可能会使用单个 RETURN QUERY SELECT ... 获得更简单/更快的效果。 This related answer 可能会有所帮助。
标签:
postgresql
stored-procedures
plpgsql
【解决方案1】:
有更多方法可以做到这一点。一:
postgres=# SELECT * FROM boo;
id | foo_id | a | b
----+--------+-----+------
1 | 1 | 100 | 1000
2 | 1 | 200 | 2000
3 | 2 | 300 | 4000
(3 rows)
postgres=# SELECT * FROM foo;
id | a | b
----+---+---
1 | 1 | 2
2 | 3 | 4
(2 rows)
CREATE OR REPLACE FUNCTION foo_boo()
RETURNS TABLE (foo_a int, foo_b int, boo_a int, boo_b int) AS $$
BEGIN
FOR foo_a, foo_b, boo_a, boo_b IN
SELECT f.a fa, f.b fb, b.a ba, b.b bb
FROM foo f
JOIN boo b
ON f.id = boo.foo_id
LOOP
RETURN NEXT;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
postgres=# SELECT * FROM foo_boo();
foo_a | foo_b | boo_a | boo_b
-------+-------+-------+-------
1 | 2 | 100 | 1000
1 | 2 | 200 | 2000
3 | 4 | 300 | 4000
(3 rows)