尝试使用if语句创建函数时的Postgresql语法错误

时间:2020-01-25 07:31:22

标签: postgresql if-statement plpgsql stored-functions

我是Postgresql的新手。所以,我正在尝试创建一个函数,但是我得到的错误消息为

错误:“ IF”行或附近的语法错误第7行:IF区域名= NULL或密码= NULL然后

我提到了这个link

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 个答案:

答案 0 :(得分:2)

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$;

我还强烈建议您停止使用带引号的标识符,从长远来看,它们比值得的麻烦得多。

答案 1 :(得分:0)

returning用于声明函数的返回类型。为了实际返回值,您应该使用return

IF areaname IS NULL OR pincode IS NULL THEN 
    RETURN false; -- Here!
ELSE
    -- etc.