如何声明函数的返回类型,返回未命名的表
Posted
技术标签:
【中文标题】如何声明函数的返回类型,返回未命名的表【英文标题】:How to declare returning type for function, returning unnamed table 【发布时间】:2014-03-20 08:29:01 【问题描述】:我想创建一个函数,它返回一个有 2 列的表:
i integer -- or bigint?
arr integer[] -- array of integer
在这个函数中我应该写什么而不是???
:
CREATE OR REPLACE FUNCTION test()
RETURNS ???
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY (
SELECT i, (ARRAY[11,22,33])[i]
FROM generate_series(
1,
array_upper(ARRAY[11,22,33],1)
) i
);
END;
$$;
【问题讨论】:
RETURNS TABLE
。 postgresql.org/docs/current/static/sql-createfunction.html
【参考方案1】:
查看this问题的答案, 函数返回表示例:
CREATE OR REPLACE FUNCTION foo(a int)
RETURNS TABLE(b int, c int) AS $$
BEGIN
RETURN QUERY SELECT i, i+1 FROM generate_series(1, a) g(i);
END;
$$ LANGUAGE plpgsql;
【讨论】:
【参考方案2】:你不需要 plpgsql。一个简单的 SQL 函数就可以完成这项工作:
CREATE OR REPLACE FUNCTION test(_arr anyarray)
RETURNS TABLE (idx int, elem anyelement)
$func$
SELECT i, _arr[i] FROM generate_subscripts(_arr, 1) i
$func$ LANGUAGE sql AS
呼叫:
SELECT * FROM test(ARRAY[11,22,33]::int[]); -- Cast to declare type for literals
多态参数anyarray
适用于任何基本类型的数组。How to write a function that returns text or integer values?
使用generate_subscripts() 来简化任务。
有关从函数返回的更多信息:How to return result of a SELECT inside a function in PostgreSQL?
Postgres 9.4
在即将发布的 Postgres 9.4 中有一个闪亮的新技巧:WITH ORDINALITY
。此相关答案中的详细信息:PostgreSQL unnest() with element number
简化为(无附加功能):
SELECT * FROM unnest(ARRAY[11,22,33]::int[]) WITH ORDINALITY AS x (elem, idx)
【讨论】:
以上是关于如何声明函数的返回类型,返回未命名的表的主要内容,如果未能解决你的问题,请参考以下文章