2012-12-31 99 views
0

我正在學習postgreqsql的結果,並想知道如果我可以把長選擇在存儲過程中 這樣一個應該返回從兩個連接表:PosgreSQL返回加入選擇

CREATE OR REPLACE FUNCTION api.book_list() 
RETURNS TABLE (
    id   BIGINT, 
    published DATE, 
    category VARCHAR, 
    author  VARCHAR, 
    name  VARCHAR 
) AS $$ 
BEGIN 
    SELECT 
    b.id, 
    b.published, 
    c.name AS category, 
    b.author, 
    b.name 
    FROM 
    schemas.book AS b 
    JOIN 
    schemas.category AS c 
    ON 
    c.id = b.category_id; 
END; 
$$ 
LANGUAGE plpgsql; 

給出錯誤:

select * from api.book_list(); 
ERROR: query has no destination for result data 
HINT: If you want to discard the results of a SELECT, use PERFORM instead. 
CONTEXT: PL/pgSQL function "book_list" line 3 at SQL statement 
+0

使用不同別名的交叉帖子:http://dba.stackexchange.com/questions/31251/postgresql-return-joined-results-of-select –

回答

1

嘗試:

BEGIN 
    return query 
    SELECT 
    b.id, 
    b.published, 
    c.name AS category, 
    b.author, 
    b.name 
    FROM 
    schemas.book AS b 
    JOIN 
    schemas.category AS c 
    ON 
    c.id = b.category_id; 
END; 
2

對於像THI一個簡單的查詢S,我會使用一個VIEWSQL function

CREATE OR REPLACE FUNCTION api.book_list() 
RETURNS TABLE (
    id   bigint, 
    published date, 
    category varchar, 
    author  varchar, 
    name  varchar) AS 
$func$ 
    SELECT b.id 
     ,b.published 
     ,c.name -- AS category -- alias irrelevant and conflicts with OUT param 
     ,b.author 
     ,b.name 
    FROM schemas.book b 
    JOIN schemas.category c ON c.id = b.category_id 
$func$ 
LANGUAGE sql; 

那麼你不需要RETURN QUERYBEGINEND像你plpgsql做。