2016-12-06 67 views
1

我越來越麻煩PostgreSQL中返回值返回一個簡單的查詢,我創造了這樣的功能(編者):使用PLPGSQL的`RETURN SETOF`與加盟

CREATE OR REPLACE FUNCTION GetComissionamento(pv varchar(50)) 
RETURNS SETOF tb_comissionamentos AS 
$$ 
BEGIN 
SELECT com.* FROM tb_vendas as vendas 
INNER JOIN tb_pagamentos as pg on vendas.id_venda = pg.id_venda 
INNER JOIN tb_comissionamentos as com on vendas.id_venda = com.id_venda 
    AND com.id_pagamento = pg.id_pagamento 
WHERE id_venda_imobiliaria = pv; 
END 
$$ 
LANGUAGE plpgsql; 

,我想返回查詢所說的表tb_comissionamento上的數據。 我該怎麼辦?當我打電話的功能,我得到了錯誤信息:

ERROR: query has no destination for result data 
HINT: If you want to discard the results of a SELECT, use PERFORM instead. 

回答

2

這是不好的。

  1. 這應該是一個VIEW而不是函數

這樣,

CREATE VIEW GetComissionamento AS 
SELECT com.* FROM tb_vendas as vendas 
    INNER JOIN tb_pagamentos as pg on vendas.id_venda = pg.id_venda 
    INNER JOIN tb_comissionamentos as com on vendas.id_venda = com.id_venda 
     AND com.id_pagamento = pg.id_pagamento; 

然後(其中$ PV是你的價值),

SELECT * 
FROM GetComissionamento 
WHERE id_venda_imobiliaria = $pv; 
  1. 如果你打算把這個簡單的東西變成一個函數使用plpgsql

像這樣sql代替,

CREATE FUNCTION GetComissionamento(varchar(50)) 
RETURNS tb_comissionamentos AS $$ 
SELECT com.* FROM tb_vendas as vendas 
INNER JOIN tb_pagamentos as pg on vendas.id_venda = pg.id_venda 
INNER JOIN tb_comissionamentos as com on vendas.id_venda = com.id_venda 
    AND com.id_pagamento = pg.id_pagamento 
WHERE id_venda_imobiliaria = $1; 
$$ LANGUAGE SQL; 
  • 如果你要保持它作爲一個PLPGSQL使用RETURN QUERY
  • 這樣,

    CREATE OR REPLACE FUNCTION GetComissionamento (pv varchar(50)) 
    RETURNS tb_comissionamentos AS $$ 
    BEGIN 
        RETURN QUERY 
        SELECT com.* FROM tb_vendas as vendas 
        INNER JOIN tb_pagamentos as pg on vendas.id_venda = pg.id_venda 
        INNER JOIN tb_comissionamentos as com on vendas.id_venda = com.id_venda 
         AND com.id_pagamento = pg.id_pagamento 
        WHERE id_venda_imobiliaria = pv; 
        -- error checking or whatever 
        RETURN; 
    END; 
    $$ LANGUAGE plpgsql; 
    
    0

    燁,得到了錯誤,忘記返回查詢

    CREATE OR REPLACE FUNCTION GetComissionamento(pv varchar(50)) 
    RETURNS SETOF tb_comissionamentos AS 
    $$ 
    BEGIN 
    RETURN QUERY SELECT com.* FROM tb_vendas as vendas 
    INNER JOIN tb_pagamentos as pg on vendas.id_venda = pg.id_venda 
    INNER JOIN tb_comissionamentos as com on vendas.id_venda = com.id_venda 
        AND com.id_pagamento = pg.id_pagamento 
    WHERE id_venda_imobiliaria = pv; 
    END 
    $$ 
    LANGUAGE plpgsql; 
    
    +0

    看看我的回答你這個再走。 =) –

    +0

    也可以考慮在將來的http://dba.stackexchange.com上提問這些問題。 –