如何使用 RECORD 在 PostgreSQL 中返回多行?
Posted
技术标签:
【中文标题】如何使用 RECORD 在 PostgreSQL 中返回多行?【英文标题】:How to return multiple rows in PostgreSQL using RECORD? 【发布时间】: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;
【问题讨论】:
【参考方案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
?以上是关于如何使用 RECORD 在 PostgreSQL 中返回多行?的主要内容,如果未能解决你的问题,请参考以下文章
进一步改进Active Record / Postgresql查询
如何在 Postgresql 中对 JSONB 数组中的值求和?
Greenplum(PostgreSql)中函数内游标的使用实例