【问题标题】:How to return multiple rows in PostgreSQL using RECORD?如何使用 RECORD 在 PostgreSQL 中返回多行?
【发布时间】:2011-08-11 23:59:17
【问题描述】:

我正在尝试创建一个在多个表上运行 SQL 查询并从查询中输出结果表的函数。结果表将有多行。我在这方面遇到了很多困难,我已经阅读了建议使用RETURN NEXT 的帖子,但我也无法让它发挥作用。据我了解,RECORD 可以使用,因为它采用输入数据的值。 到目前为止,这是我的代码:

CREATE OR REPLACE FUNCTION
    most_docs()
RETURNS
    SETOF RECORD
AS $$
DECLARE
    result RECORD;
BEGIN
    CREATE VIEW MOSTDOC AS
    SELECT P.country, COUNT(P.country) AS cnt
    FROM Producer P, Movie M, ProducerMovie PM
    WHERE M.title = PM.title
    AND M.year = PM.year
    AND P.name = PM.name
    AND M.genre = 'Documentary'
    GROUP BY P.country;

    SELECT DISTINCT M.country INTO result
    FROM MOSTDOC M
    WHERE M.cnt = (SELECT MAX(M.cnt)
    FROM MOSTDOC M);

    RETURN result;
END;
$$ LANGUAGE plpgsql;

任何帮助将不胜感激。谢谢。

--------- 单词进行中代码

CREATE OR REPLACE FUNCTION
    most_docs()
RETURNS
    SETOF RECORD
AS $$
DECLARE
result RECORD
BEGIN
    CREATE VIEW MOSTDOC AS
    SELECT P.country, COUNT(P.country) AS cnt
    FROM Producer P, Movie M, ProducerMovie PM
    WHERE M.title = PM.title
    AND M.year = PM.year
    AND P.name = PM.name
    AND M.genre = 'Documentary'
    GROUP BY P.country;

    RETURN QUERY SELECT DISTINCT M.country
    FROM MOSTDOC M
    WHERE M.cnt = (SELECT MAX(M.cnt)
    FROM MOSTDOC M);
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    如果我正确理解了你的问题,你会尝试做这样的事情(对于返回 setof 的函数,我总是使用类型)

    CREATE TYPE frt_test_type AS
       (
        country character varying,
        cnt integer,
        country character varying); /* types may vary */
    
    CREATE OR REPLACE FUNCTION
      RETURNS SETOF frt_test_type AS
    $BODY$DECLARE r record;
    BEGIN
      for r in     SELECT P.country, COUNT(P.country) AS cnt, 
    FROM Producer P, Movie M, ProducerMovie PM
    WHERE M.title = PM.title
    AND M.year = PM.year
    AND P.name = PM.name
    AND M.genre = 'Documentary'
    GROUP BY P.country;
      loop
          return next r; 
      end loop;
      return; 
    END;$BODY$
      LANGUAGE 'plpgsql'
    

    【讨论】:

      【解决方案2】:

      根据this answer,你需要的是:

      RETURN QUERY SELECT DISTINCT......
      

      【讨论】:

      • 这是否意味着我不需要声明变量result RECORD并删除对应的RETURN result行?如果我这样做,我会得到“返回‘记录’的函数需要列定义列表”
      • 我认为你仍然需要result RECORD,但可以省略RETURN result
      • 嗯,我遇到了同样的错误。我更新了问题以显示新代码。如果它有所不同,我调用函数的方式是SELECT * most_docs()。这是正确的语法吗?
      • 我相信SELECT * FROM most_docs() 是正确的。您可能必须在 RETURN QUERY 行中将 M.country 转换为正确的数据类型,例如:M.country::text 或任何类型。
      • 我怎样才能把它放在正确的语法中。 RETURN QUERY SELECT DISTINCT M.country M.country%TYPE ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多