@artemfisher

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

Добрый день.

Пишу функцию.
create or replace function myfunc()
returns setof record
as $$
declare
res record;
begin
execute 'select * from users order by name limit 1' into res;
return next res;
execute 'select * from users order by name limit 1 offset 1' into res;
return next res;
return;
end;
$$
language plpgsql


Функция создается, но при ее вызове происходит ошибка:
ERROR: требуется режим материализации, но он недопустим в этом контексте
CONTEXT: функция PL/pgSQL myfunc(), строка 6, оператор RETURN NEXT

ОШИБКА: требуется режим материализации, но он недопустим в этом контексте
SQL state: 0A000Query returned successfully in 279 msec.


Не смог найти решение в интернете.
В официальной документации такая проблема не описывается
  • Вопрос задан
  • 384 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Вариант записи допустимый, а вот вызываете неверно:
melkij=> create or replace function myfunc()
returns setof record
as $$
declare
res record;
begin
execute 'select 1' into res;
return next res;
execute 'select 2' into res;
return next res;
return;
end;
$$
language plpgsql;
CREATE FUNCTION
melkij=> select * from myfunc() as s(i int);
 i 
---
 1
 2
(2 строки)

melkij=> select myfunc();
ERROR:  materialize mode required, but it is not allowed in this context
КОНТЕКСТ:  PL/pgSQL function myfunc() line 6 at RETURN NEXT


PS: прямой return query (или return query execute если это реально необходимо) будет проще и нагляднее перекладывания return next через лишнюю переменную.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы