PostgreSQL PL/pgSQL函数报错:LANGUAGE附近存在语法错误
PL/pgSQL函数语法错误(ERROR: syntax error on or near "LANGUAGE")解决方法
错误原因
你的代码中$BODY$后面多了一个分号,PostgreSQL会将$BODY$;视为函数定义的结束标记,后续的LANGUAGE plpgsql;就变成了独立的无效语句,因此触发语法错误。
修正后的完整代码
drop function if exists get_person_and_subtable(integer); CREATE OR REPLACE FUNCTION get_person_and_subtable(IN id integer) RETURNS SETOF record AS $BODY$ DECLARE var_categ CHAR(5); var_id INT = id; BEGIN var_categ := (select PER_CATEG from T_PERSONNE where PER_ID = var_id); IF var_categ ='EMP' THEN RETURN QUERY SELECT * FROM T_PERSONNE INNER JOIN T_EMPLOYE ON T_PERSONNE.PER_ID = T_EMPLOYE.EMP_ID WHERE PER_ID = var_id; END IF; IF var_categ ='PROSP' THEN RETURN QUERY SELECT * FROM T_PERSONNE INNER JOIN T_PROSPECT ON T_PERSONNE.PER_ID = T_PROSPECT.PROSP_ID WHERE PER_ID = var_id; END IF; IF var_categ = 'VIS' THEN RETURN QUERY SELECT * FROM T_PERSONNE INNER JOIN T_VISITEUR ON T_PERSONNE.PER_ID = T_VISITEUR.VIS_ID WHERE PER_ID = var_id; END IF; END; $BODY$ LANGUAGE plpgsql;
额外优化建议
- DECLARE语句合并:多个变量声明可以放在同一个
DECLARE块下,无需重复写DECLARE,让代码更简洁。 - 返回类型优化:
RETURNS SETOF record需要在调用时明确指定返回结构(比如SELECT * FROM get_person_and_subtable(1) AS (per_id int, ...)),使用起来比较麻烦。如果三个连接查询的返回字段结构一致,可以改用RETURNS TABLE(字段名 类型, ...)明确定义返回结构;如果结构不同,建议返回JSON类型(RETURNS SETOF json),在RETURN QUERY时用row_to_json()包装结果,方便调用。
内容的提问来源于stack exchange,提问作者limier
相关产品推荐
相关产品推荐

