SELECT FROM функции, возвращающей запись с произвольным числом столбцов - PullRequest
5 голосов
/ 06 февраля 2012

Я использую базу данных PostgreSQL.

У меня есть мой plpgsql FUNCTION, который возвращает один record с произвольным числом столбцов.
Из-за этого произвола мне нужноиспользуйте что-то вроде:

SELECT * FROM my_function(97)

Но это не работает, поскольку Postgres выдает мне следующую ошибку:

для определения функций, возвращающих «запись» * 1012, необходим список определений столбцов*

Но если я это сделаю:

SELECT my_function(97)

Я могу видеть ожидаемый результат, но инкапсулированный в одном столбце.

Есть ли способ получить ожидаемый результат какнабор столбцов, как задумано функцией, а не один столбец, инкапсулирующий их все?

Ответы [ 5 ]

6 голосов
/ 15 марта 2013

Когда функция просто RETURNS record или SETOF record (а параметры OUT отсутствуют), PostgreSQL не знает имен и типов ее элементов, и вам необходимо предоставлять список определений столбцов для каждого звоните.

Избегайте этого , если это возможно, и верните вместо него хорошо известный тип . Помимо обходных путей, предоставляемых @Chris , существует несколько других способов объявления возвращаемого типа. Недавно я написал подробные ответы:

На SO уже есть довольно много связанных вопросов. Я помню, как отвечал на несколько из них.
Попробуйте поискать!

3 голосов
/ 22 мая 2015

При использовании функции возврата набора (setof) в списке выбора в левой части ОТ функция возвращает составной тип . Использование функции в списке выбора может быть затруднено при использовании таблицы в качестве входных данных для функции.

Существует способ ВЫБРАТЬ элементы из одного столбца составного типа:

SELECT
  (my_function).field1,
  (my_function).field2,
  (my_function).field3
FROM
(SELECT my_function(*) 
 FROM sometable) t
2 голосов
/ 15 марта 2013

У вас есть несколько вариантов здесь:

  1. Вернуть REFCURSOR и извлечь из этого курсора в приложении. Обратите внимание, что вы можете вернуть несколько REFCURSORS, если вам нужно вернуть несколько наборов результатов.

  2. Вернуть XML-документ и проанализировать его в приложении.

  3. Используйте набор переменных OUT, верните RECORD и определите, какую из них выбрать из

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

0 голосов
/ 21 марта 2016

Я не уверен, что следую тому, что вы ищете, но работает ли это?

SELECT (my_function(97)).my_column
0 голосов
/ 06 февраля 2012

Чтобы вернуть «набор столбцов», вы должны будете определить тип возвращаемого значения как TABLE или SETOF, и в этом случае вы фактически вернете набор записей, из которого вы сможете SELECT. 1004 *

Для получения дополнительной информации о функциях, возвращающих SETOF, посмотрите эту ссылку на документацию

...