Postgresql синтаксическая ошибка при попытке создать функцию с оператором if - PullRequest
1 голос
/ 25 января 2020

Я новичок в postgresql. Итак, я пытаюсь создать функцию, но получаю сообщение об ошибке как

ОШИБКА: синтаксическая ошибка в или около "IF" ЛИНИЯ 7: IF areaname = NULL ИЛИ pin-код = NULL THEN

Я ссылался на эту ссылку .

CREATE FUNCTION location."fn_updateInArea"(area_id integer, areaname text, pincode text)
    RETURNS boolean
    LANGUAGE 'sql'

AS $BODY$
BEGIN
IF areaname IS NULL OR pincode IS NULL THEN 
RETURNING false;
ELSE
UPDATE location.areainfo SET 
area_name=CASE WHEN (areaname) IS NULL THEN (SELECT area_name from location.areainfo WHERE id=area_id) ELSE area_name END, 
pin_code=CASE WHEN (pincode) IS NULL THEN (SELECT pin_code from location.areainfo WHERE id=area_id) ELSE pin_code END
WHERE id=area_id AND "deleteIndex"=false;
RETURNING true;
END IF;
END;
$BODY$;

ALTER FUNCTION location."fn_updateInArea"(integer, text, text)
    OWNER TO postgres;

Я знаю, что это глупая ошибка, но выручите меня.

Ответы [ 2 ]

2 голосов
/ 25 января 2020

В SQL нет IF, вы должны использовать language plpgsql, если хотите. И чтобы вернуть значение, вам нужно использовать return, а не returning.

. Вам также не нужен оператор SELECT для доступа к значению столбца в строке, которую вы хотите обновить, просто ссылаться на столбец напрямую. Вы можете упростить ваши выражения CASE до простого coalesce ()

CREATE FUNCTION location."fn_updateInArea"(p_area_id integer, p_areaname text, p_pincode text)
    RETURNS boolean
    LANGUAGE plpgsql --<< Here
AS $BODY$
BEGIN
  IF p_areaname IS NULL OR p_pincode IS NULL THEN 
    RETURN false; --<< use RETURN not RETURNING
  ELSE
    UPDATE location.areainfo 
      SET area_name = coalesce(p_areaname, area_name)
          pin_code = coalesce(p_pincode, pin_code)
    WHERE id=area_id 
    AND "deleteIndex"=false;

    RETURN true;
  END IF;
END;
$BODY$;

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

0 голосов
/ 25 января 2020

returning используется для объявления типа возвращаемого значения функции. Чтобы на самом деле вернуть значение, вы должны использовать return:

IF areaname IS NULL OR pincode IS NULL THEN 
    RETURN false; -- Here!
ELSE
    -- etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...