开发者

What is the correct way to define a Postgres SQL-lang function that returns multiple columns?

开发者 https://www.devze.com 2023-03-29 23:09 出处:网络
I have the following function, based on the SQL Functions Returning Sets section of the PG docs, which accepts two arrays of equal length, and unpacks them into a set of rows with two columns.

I have the following function, based on the SQL Functions Returning Sets section of the PG docs, which accepts two arrays of equal length, and unpacks them into a set of rows with two columns.

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;

I execute the function in PGAdmin3, like this:

SELECT unpack_test(int_col, double_col) FROM test_data

It basically works, but the output looks like this:

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

In other words, the result is a single record, as opposed to two columns. I found this question that seems to provide an answer, but it deals with a function that selects from a table directly, whereas mine accepts the columns as arguments, since it needs to generate the series used to iterate 开发者_如何学Cover them. I therefore can't call it using SELECT * FROM function, as suggested in that answer.


First, you'll need to create a type for the return value of your function. Something like this could work:

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

Then change your function to return this type instead of record.

Then you can use it like this:

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

It doesn't seem possible to take a function returning a generic record type and use it in this manner.

0

精彩评论

暂无评论...
验证码 换一张
取 消