Вернуть запрос из функции? - PullRequest
       38

Вернуть запрос из функции?

2 голосов
/ 26 сентября 2011

Я использую PostgreSQL 8.4 и хочу создать функцию, которая возвращает запрос с большим количеством строк.
Следующая функция не работает:

create function get_names(varchar) returns setof record AS $$
declare
    tname alias for $1;
    res setof record;
begin
    select * into res from mytable where name = tname;
    return res;
end;
$$ LANGUAGE plpgsql;

Типrecord допускает только одну строку.

Как вернуть весь запрос?Я хочу использовать функции в качестве шаблонов запросов.

1 Ответ

5 голосов
/ 26 сентября 2011
CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
BEGIN
   RETURN QUERY
   SELECT t.col_a, t.col_b  -- must match RETURNS TABLE
   FROM   mytable t
   WHERE  t.name = _tname;    
END
$func$  LANGUAGE plpgsql;

Звоните так:

SELECT * FROM get_names('name')

Основные моменты:

  • Использование RETURNS TABLE, поэтому вам не нужно предоставлять список имен столбцов при каждом вызове.

  • Используйте RETURN QUERY, намного проще.

  • Имена столбцов с указанием таблицы, чтобы избежать конфликтов имен с идентично именованными OUT параметрами (включая столбцы, объявленные с RETURNS TABLE).

  • Используйте именованную переменную вместоALIAS.Проще, делать то же самое, и это предпочтительный способ.

  • Такая простая функция также может быть написана в LANGUAGE sql:

CREATE OR REPLACE FUNCTION get_names(_tname varchar)
  RETURNS TABLE (col_a integer, col_b text) AS
$func$
SELECT t.col_a, t.col_b  --, more columns - must match RETURNS above
FROM   mytable t
WHERE  t.name = $1;
$func$ LANGUAGE sql;
...