Тип возврата функции PostgreSQL - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь определить функцию следующим образом:

CREATE FUNCTION myfunction(list_of_ids integer[]) RETURNS record AS $$
  SELECT a.col1, b.col2 FROM a, b WHERE col1 = ANY($1);
$$ LANGUAGE 'sql'

Однако postgres, похоже, не доволен «record» в качестве возвращаемого типа, что выдает мне эту ошибку, когда я пытаюсь выполнитьфункция:

ERROR:  a column definition list is required for functions returning "record"

Просматривая документы, хотя я не могу понять, как предоставить этот список определений столбцов.

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Прежде всего, ваш запрос кажется отключенным: нет Условие JOIN для таблиц a и b? Вы не хотите декартово произведение, не так ли? Попробуйте что-то вроде:

SELECT a.col1, b.col2
FROM   a
JOIN   b ON <some condition like b.a_id = a.a_id>
WHERE  col1 = ANY($1);

Далее, используйте тип возврата для функции, чтобы вам не приходилось предоставлять список определений столбцов для каждого вызова. В примере я использую RETURNS TABLE. Подробнее о читайте в руководстве . Может выглядеть так:

CREATE FUNCTION myfunction(list_of_ids integer[])
 RETURNS TABLE (
  col1 text -- has to match the type of the column a.col1 that is returned.
 ,col2 text -- match type of a.col2
) AS
$$
  SELECT a.col1, b.col2
  FROM   a
  JOIN   b ON <some condition like b.a_id = a.a_id>
  WHERE  col1 = ANY($1);
$$
  LANGUAGE sql;

Одинарные кавычки вокруг 'sql' - просто шум. Может выступать в качестве ключевого слова.

Теперь вы можете позвонить:

SELECT * FROM  myfunction('{11,23,6}'::integer[]);
0 голосов
/ 18 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...