我想创建一个函数,它返回一个包含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;
$$;
答案 0 :(得分:0)
查看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;
答案 1 :(得分:0)
你不需要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中有一个闪亮的新技巧:WITH ORDINALITY
。这个相关答案的细节:
PostgreSQL unnest() with element number
简化为(无附加功能):
SELECT * FROM unnest(ARRAY[11,22,33]::int[]) WITH ORDINALITY AS x (elem, idx)