PostgreSQL函数创建报错:END $GO$;处语法错误求助
问题分析与解决
你的函数报错源于PL/pgSQL条件语句的语法错误:
- 若使用
ELSE IF(两个单词),相当于在ELSE块内嵌套了新的IF语句,需要额外的END IF来闭合这个嵌套结构; - PL/pgSQL更规范的多分支条件写法是用原生的
ELSIF(单个单词),无需额外的闭合语句。
修正后的函数代码(两种方案)
方案1:使用ELSIF(推荐)
CREATE FUNCTION funcGetGameID( parm_p1 CHAR(8), parm_p2 CHAR(8)) RETURNS INT LANGUAGE plpgsql SECURITY DEFINER AS $GO$ DECLARE gid INT; BEGIN SELECT g_id INTO gid FROM tblGames WHERE p1_id = parm_p1 AND p2_id = parm_p2; IF gid IS NULL THEN RETURN NULL; ELSIF parm_p1 > parm_p2 THEN RETURN (-1)*gid; ELSE RETURN gid; END IF; END $GO$;
方案2:补全嵌套IF的END IF
如果坚持使用ELSE IF,需添加额外的END IF闭合内层IF:
CREATE FUNCTION funcGetGameID( parm_p1 CHAR(8), parm_p2 CHAR(8)) RETURNS INT LANGUAGE plpgsql SECURITY DEFINER AS $GO$ DECLARE gid INT; BEGIN SELECT g_id INTO gid FROM tblGames WHERE p1_id = parm_p1 AND p2_id = parm_p2; IF gid IS NULL THEN RETURN NULL; ELSE IF parm_p1 > parm_p2 THEN RETURN (-1)*gid; ELSE RETURN gid; END IF; END IF; END $GO$;
额外提示:CHAR(8)会自动补空格至8位长度,若实际存储的是不定长字符串,建议改用VARCHAR(8)或TEXT,避免因空格导致的匹配异常。
内容的提问来源于stack exchange,提问作者Aetrius
相关产品推荐
相关产品推荐

