如何为函数声明返回类型,返回未命名的表

时间:2014-03-20 08:29:02

标签: sql arrays postgresql plpgsql set-returning-functions

我想创建一个函数,它返回一个包含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;
$$;

2 个答案:

答案 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

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)