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

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)

【讨论】:

以上是关于如何声明函数的返回类型,返回未命名的表的主要内容,如果未能解决你的问题,请参考以下文章

五 函数

Go---第五章:函数(小知识点笔记)

我应该如何声明返回没有数据的 $q 承诺的函数的返回类型?

如何做一个函数来从 pl/sql 中的表中返回行类型?

如何修复“函数声明了一个不透明的返回类型,但在其主体中没有返回语句来推断基础类型”错误?

golang 函数