Все существующие в настоящее время ответы устарели или были неэффективны с самого начала.
Если вы хотите вернуть три integer
столбца.
Функция PL / pgSQL
Вот как вы это делаете с современным PL / pgSQL (PostgreSQL 8.4 или новее):
CREATE OR REPLACE FUNCTION f_foo(open_id numeric)
RETURNS TABLE (a int, b int, c int) AS
$func$
BEGIN
-- do something with open_id?
RETURN QUERY VALUES
(1,2,3)
, (3,4,5)
, (3,4,5);
END
$func$ LANGUAGE plpgsql IMMUTABLE ROWS 3;
Звоните:
SELECT * FROM f_foo(1);
Основные баллы
Используйте RETURNS TABLE
, чтобы определить тип строки для возврата.
Или RETURNS SETOF mytbl
для использования предварительно определенного типа строки.
Используйте RETURN QUERY
для возврата нескольких строк одной командой.
Используйте выражение VALUES
для ввода нескольких строк вручную. Это стандартный SQL, и он всегда был .
Используйте имя параметра (open_id numeric)
вместо ALIAS
, что не рекомендуется для стандартных имен параметров. В примере параметр не используется, а только шум ...
Нет необходимости заключать в кавычки совершенно легальные идентификаторы. Двойные кавычки нужны только для принудительного использования недопустимых имен (смешанный регистр, недопустимые символы или зарезервированные слова).
Волатильность функции может быть IMMUTABLE
, поскольку результат никогда не меняется.
ROWS 3
является необязательным, но поскольку мы знаем , сколько строк возвращено, мы могли бы также объявить его Postgres. Может помочь планировщику запросов выбрать лучший план.
Простой SQL
В таком простом случае, как этот, вы можете вместо этого использовать простой SQL-оператор:
VALUES (1,2,3), (3,4,5), (3,4,5)
Или, если вы хотите (или хотите) определить конкретные имена и типы столбцов:
SELECT *
FROM (
VALUES (1::int, 2::int, 3::int)
, (3, 4, 5)
, (3, 4, 5)
) AS t(a, b, c);
Функция SQL
Вы можете обернуть его в простую функцию SQL . Пример без параметра функции, поскольку он не используется:
CREATE OR REPLACE FUNCTION f_foo()
RETURNS TABLE (a int, b int, c int) AS
$func$
VALUES (1, 2, 3)
, (3, 4, 5)
, (3, 4, 5);
$func$ LANGUAGE sql IMMUTABLE ROWS 3;