PL/pgSQL. Не дает вернуть из функции значение типа setof record. Причина?

При использовании PL/pgSQL в PostgreSQL есть некоторые особенности, связанные с возвращаемыми типами данных из функций. По умолчанию в PL/pgSQL функции возвращают значение типа "void", то есть не возвращают никакого значения. Однако, вы можете использовать ключевое слово "RETURN" для явного указания возвращаемого значения в функции.

Тип "setof record" является особенным типом данных в PostgreSQL, который представляет набор записей с неопределенной структурой. Он может содержать различные типы данных в разных колонках, но порядок колонок и их типы должны быть определены на этапе исполнения.

Согласно документации PostgreSQL, PL/pgSQL не поддерживает напрямую возврат типа данных "setof record" из функций. Это связано с тем, что PL/pgSQL непосредственно не знает о структуре и типах данных возвращаемых записей, и, следовательно, не может корректно обработать этот тип данных.

Однако, существуют несколько способов обойти это ограничение. Один из подходов заключается в использовании комплексных типов данных (например, создание нового типа с явно определенной структурой) и возвращение набора записей этого типа из функции.

Пример кода для создания нового типа данных и его использование в функции может выглядеть следующим образом:

CREATE TYPE my_record_type AS (
    id INTEGER,
    name VARCHAR
);

CREATE OR REPLACE FUNCTION my_function()
    RETURNS SETOF my_record_type AS $$
DECLARE
    r my_record_type;
BEGIN
    -- Заполнение данных
    r.id := 1;
    r.name := 'John';
    RETURN NEXT r;

    r.id := 2;
    r.name := 'Jane';
    RETURN NEXT r;
END;
$$ LANGUAGE plpgsql;

В этом примере мы создали новый тип данных my_record_type с двумя полями - id и name. Затем мы объявили функцию my_function(), которая использует этот тип данных как возвращаемый тип.

Внутри функции мы заполнили переменную r значениями и вернули ее с помощью ключевого слова RETURN NEXT. Для возврата нескольких записей мы вызываем RETURN NEXT для каждой записи.

Теперь, когда функция my_function() будет вызвана, она вернет набор записей указанного типа my_record_type.

В заключение, PL/pgSQL в PostgreSQL не позволяет напрямую возвращать значения типа "setof record" из функций из-за отсутствия информации о структуре и типах данных возвращаемых записей. Однако, данную проблему можно решить путем создания нового комплексного типа данных и возвращения набора записей этого типа из функции.