Как правильно определить функцию Postgres SQL-lang, которая возвращает несколько столбцов? - PullRequest
2 голосов
/ 23 августа 2011

У меня есть следующая функция, основанная на разделе Функции SQL, возвращающие наборы документации PG, которая принимает два массива одинаковой длины и распаковывает их в набор строк с двумя столбцами.

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)     |
|-----------|
 ...

Другими словами, результатом является одна запись, а не два столбца. Я нашел этот вопрос , который, кажется, дает ответ, но он имеет дело с функцией, которая выбирает непосредственно из таблицы, в то время как моя принимает столбцы в качестве аргументов, так как она должна генерировать серии, используемые для их перебора , Поэтому я не могу назвать его, используя SELECT * FROM function, как предлагается в этом ответе.

1 Ответ

3 голосов
/ 23 августа 2011

Сначала вам нужно создать тип для возвращаемого значения вашей функции. Примерно так может работать:

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

Не представляется возможным взять функцию, возвращающую общий тип записи, и использовать ее таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...