2014-02-25 22 views
1

如何從plpgsql中的多個表中返回多行,我試圖從2個表中返回行與內部聯接? 這是我的代碼如何從plpgsql中的多個表中返回多行?

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 

我需要從類別

+0

根據什麼'一些處理這裏'是什麼,你可能會得到更簡單/更快的一個'返回查詢選擇...'。 [這相關的答案](http://stackoverflow.com/questions/8605174/postgresql-error-42601-a-column-definition-list-is-required-for-functions-ret/8611675#8611675)可能會有所幫助。 –

回答

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) 
+0

真棒,謝謝你帕維爾 –

相關問題