Почему в PL/pgSQL не удается вернуть значение типа setof record из функции? В чем причина?

  • 31 августа 2023 г. 15:56
Ответы на вопрос 2
Ошибка "требуется режим материализации, но он недопустим в этом контексте" обычно возникает, когда вы пытаетесь вернуть значения типа `setof record` или `setof composite type` из функции в PL/pgSQL. Это происходит потому, что в PL/pgSQL нельзя использовать `RETURN NEXT` для возвращения набора записей, имеющих тип `record` или составного типа.

PL/pgSQL не может определить структуру составного типа во время выполнения, поэтому вам необходимо явно указать структуру результирующего набора. Один из способов сделать это - использовать `RETURNS TABLE` для определения структуры и типов столбцов возвращаемого набора записей.

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

```sql
CREATE FUNCTION myfunc()
  RETURNS TABLE (id integer, name varchar)
  LANGUAGE plpgsql
AS $$
BEGIN
  RETURN QUERY SELECT id, name FROM users ORDER BY name LIMIT 1;
  RETURN QUERY SELECT id, name FROM users ORDER BY name OFFSET 1 LIMIT 1;
END;
$$;
```

В этом примере `myfunc()` возвращает набор записей с двумя столбцами, `id` и `name`, из таблицы `users`. Первый запрос возвращает первую запись, отсортированную по полю `name`, а второй запрос возвращает следующую запись из этого же набора данных.

Теперь вы можете вызвать функцию `myfunc()` следующим образом:

```sql
SELECT * FROM myfunc();
```

Вы должны получить результат, содержащий две записи из таблицы `users`.

Связка `RETURNS TABLE` также позволяет вам определить любую другую структуру и тип столбцов, которые вам может потребоваться вернуть из функции.
- Замените использование функции `return next` на `return query` для более простого и понятного кода.
- Важно вызывать функцию правильно, обратите внимание на синтаксис вызова.
- Убедитесь, что используете режим `materialize` при вызове функции, если он требуется.
Похожие вопросы