Я пытаюсь написать функцию PL/pgSQL в postgres, которая возвращает логическое выражение. В настоящее время код выглядит так:
CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
RETURNS boolean
LANGUAGE SQL STABLE STRICT AS $$
RETURN $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
$$;
Функции first_predicate и second_predicate существуют и возвращают логические значения, но я не получаю особой помощи, глядя на них, потому что они определены чем-то вроде
SELECT COUNT(*) > 0 FROM ... WHERE ...
Я получаю следующую синтаксическую ошибку:
ERROR: syntax error at or near "RETURN"
LINE 4: RETURN $1 = $2 first_predicate($1, $2) OR second_predicate(...
^
Так что, очевидно, я неправильно понимаю что-то довольно фундаментальное здесь. Я новичок во всем, что связано с PL/pgSQL, поэтому ссылки на хороший учебник или два также будут оценены.
Проект, над которым я работаю, использует исключительно postgres и уже содержит много кода, специфичного для postgres, поэтому решения не должны переноситься на другие базы данных.
Редактировать: Исправил сам с помощью
CREATE FUNCTION is_visible_to (role integer, from_role integer)
RETURNS BOOLEAN AS '
DECLARE
role ALIAS FOR $1;
from_role ALIAS FOR $2;
BEGIN
RETURN (role = from_role) OR
first_predicate(from_role, role) OR
second_predicate(from_role, role)
END;
' LANGUAGE 'plpgsql';
Все равно был бы признателен за ответ, объясняющий, почему более поздние версии работают, а первые (даже с измененным на plpgsql
языком, как это было предложено @a_horse_with_no_name) не работают, или предоставляет некоторые полезные учебные пособия.
language sql
. В sql нет оператораreturn
, только в PL/pgSQL - person a_horse_with_no_name   schedule 03.12.2014language sql
наlangauge plpgsql
, та же ошибка. - person jjm   schedule 03.12.2014language sql
: sqlfiddle.com/#!15/7cf4a/1 иplpgsql
: sqlfiddle.com/#!15/90f62/1 Кстати: название языка идентификатор, поэтому без одинарных кавычек, пожалуйста,plpgsql
илиsql
, но не'plpgsql'
- person a_horse_with_no_name   schedule 03.12.2014