@mShpakov

Как правильно создать функцию возвращающую булевый результат выполнения селекта?

Пытаюсь создать функцию:
CREATE OR REPLACE FUNCTION checkPermission(text, text) RETURNS BOOLEAN AS
$$
BEGIN
  RETURN QUERY SELECT $1
  &&
  $2;
END;
$$ LANGUAGE plpgsql

Однако получаю ошибку:
[42601] ERROR: syntax error at or near "RETURN" 
Position: 1

Не могу понять в чем проблема

(select упростил в примере)
  • Вопрос задан
  • 910 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Вероятно при упрощении примера вы выкинули собственно саму причину синтаксической ошибки.
Потому что приведённая в вопросе хранимка синтаксически корректна, что, впрочем, не изменяет некорректности семантической.
ERROR: cannot use RETURN QUERY in a non-SETOF function

Вы не можете использовать return query для возврата одного значений. return query только для функций возвращающих множество. Булево выражение можно посчитать непосредственно в return, как в большинстве других языков:
CREATE OR REPLACE FUNCTION checkPermission(text, text) RETURNS BOOLEAN AS
$$
BEGIN
  RETURN $1 && $2;
END;
$$ LANGUAGE plpgsql


Ну и мелочь лучше записывать на language sql, что позволяет оптимизаторы делать интересные фокусы в целях повышения производительности запросов.
CREATE OR REPLACE FUNCTION checkPermission(text, text) RETURNS BOOLEAN AS
$$
  SELECT $1 && $2;
$$ LANGUAGE sql


Разумеется, это будет работать только если у вас определён оператор && для пары операндов типа text.
Ответ написан
Комментировать
longclaps
@longclaps
CREATE OR REPLACE FUNCTION checkPermission(TEXT, TEXT)
  RETURNS SETOF BOOLEAN AS
$$
BEGIN
  RETURN QUERY SELECT $1
                      &&
                      $2;
END;
$$ LANGUAGE plpgsql;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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