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

问题描述 投票:0回答:2

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

错误:“ IF”处或附近的语法错误第7行:IF区域名= NULL或个人密码= NULL THEN

我引用了此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;

我知道这将是愚蠢的错误,但确实可以帮助我。

postgresql if-statement plpgsql stored-functions
2个回答
0
投票

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

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.