如何从plpgsql中的多个表返回多行?

时间:2014-02-25 09:52:39

标签: postgresql stored-procedures plpgsql

如何从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

我需要从类别

返回名称

1 个答案:

答案 0 :(得分:4)

有更多方法可以做到这一点。之一:

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)