定义返回多列的Postgres SQL-lang函数的正确方法是什么?

时间:2011-08-23 18:07:13

标签: sql postgresql stored-procedures

我有以下函数,基于PG文档的SQL Functions Returning Sets部分,它接受两个长度相等的数组,并将它们解压缩为一组有两列的行。

CREATE OR REPLACE FUNCTION unpack_test(
    in_int INTEGER[],
    in_double DOUBLE PRECISION[],
    OUT out_int INTEGER,
    OUT out_double DOUBLE PRECISION
) RETURNS SETOF RECORD AS $$
    SELECT $1[rowx] AS out_int, $2[rowx] AS out_double
    FROM generate_series(1, array_upper($1, 1)) AS rowx;
$$ LANGUAGE SQL STABLE;

我在PGAdmin3中执行该功能,如下所示:

SELECT unpack_test(int_col, double_col) FROM test_data

它基本上有效,但输出如下:

|unpack_test|
|record     |
|-----------|
|(1, 1)     |
|-----------|
|(2, 2)     |
|-----------|
 ...

换句话说,结果是单个记录,而不是两列。我发现this question似乎提供了一个答案,但它处理的是一个直接从表中选择的函数,而我接受列作为参数,因为它需要生成用于迭代它们的系列。因此,我无法使用SELECT * FROM function来调用它,正如答案所示。

1 个答案:

答案 0 :(得分:3)

首先,您需要create a type来获取函数的返回值。这样的事情可以奏效:

CREATE TYPE unpack_test_type AS (out_int int, out_double double precision);

然后更改您的函数以返回此类型,而不是record

然后你可以像这样使用它:

SELECT (unpack_test).out_int, (unpack_test).out_double FROM
        (SELECT unpack_test(int_col, double_col) FROM test_data) as test

似乎不可能采用返回通用记录类型的函数并以这种方式使用它。