【问题标题】:How to call Postgres function returning SETOF record?如何调用返回 SETOF 记录的 Postgres 函数?
【发布时间】:2014-09-16 22:25:57
【问题描述】:

我写了以下函数:

    -- Gets stats for all markets
CREATE OR REPLACE FUNCTION GetMarketStats (
)
RETURNS SETOF record
AS
$$
BEGIN
 SELECT 'R approved offer' AS Metric,
 SUM(CASE WHEN M.MarketName = 'A+' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketAPlus24,
 SUM(CASE WHEN M.MarketName = 'A+' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketAPlus36,
 SUM(CASE WHEN M.MarketName = 'A' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketA24,
 SUM(CASE WHEN M.MarketName = 'A' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketA36,
 SUM(CASE WHEN M.MarketName = 'B' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketB24,
 SUM(CASE WHEN M.MarketName = 'B' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketB36
FROM "Market" M
 INNER JOIN "Listing" L ON L.MarketID = M.MarketID
 INNER JOIN "ListingOffer" LO ON L.ListingID = LO.ListingID;
END
$$
LANGUAGE plpgsql;

当试图这样称呼它时......

select * from GetMarketStats() AS (
   Metric VARCHAR(50),
   MarketAPlus24 INT,  
   MarketAPlus36 INT,
   MarketA24 INT,
   MarketA36 INT,
   MarketB24 INT,
   MarketB36 INT);

我收到一个错误:

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 "getmarketstats" line 2 at SQL statement

我不明白这个输出。我也尝试过使用 perform,但我认为只有在函数不返回任何内容时才需要使用它。

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    你的函数没有意义,它不返回任何东西。它看起来像一个 VIEW,那你为什么不创建一个视图呢?

    编辑: 您已将 OUT 参数或 RETURN TABLE() 与参数一起使用:

    CREATE OR REPLACE FUNCTION my_func(OUT o_id INT, OUT o_bar TEXT) 
    RETURNS SETOF RECORD AS
    $$
    BEGIN
        RETURN QUERY SELECT id, bar FROM foo;
    END;
    $$
    LANGUAGE plpgsql;
    
    
    SELECT  * FROM my_func();
    

    【讨论】:

    • 我来自 SQL Server 世界。我期望返回任何 SELECT 语句的类似行为。我会尝试更改为视图。谢谢
    • 假设我确实想传递一个参数,我该如何返回我的 SQL 查询的结果?
    • 参见示例,RETURNS TABLE(int, text) 将是另一种选择。
    • 解决实际问题的要点是使用“RETURN QUERY”使以下 SELECT 的结果集成为函数的结果。 OUT 参数/RETURNS TABLE 只是使调用更容易。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多