我是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;
我知道这将是愚蠢的错误,但确实可以帮助我。
答案 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.