2012-12-31 128 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做。