【问题标题】:Postgresql syntax error while trying to create function with if statement尝试使用 if 语句创建函数时出现 Postgresql 语法错误
【发布时间】:2020-01-25 07:31:22
【问题描述】:

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

错误:“IF”第 7 行或附近的语法错误:IF areaname = NULL OR pincode = 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      returning 用于声明函数的返回类型。为了真正返回值,你应该使用return

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        相关资源
        最近更新 更多