You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

额外优化建议

  1. DECLARE语句合并:多个变量声明可以放在同一个DECLARE块下,无需重复写DECLARE,让代码更简洁。
  2. 返回类型优化: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:12