PostgreSQL函数创建报错:ERROR: syntax error at or near "$func$"问题排查
问题原因与解决方法
你的函数存在两个问题,其中直接触发语法错误的是:
- 你声明函数使用
LANGUAGE sql,但函数体却用了PL/pgSQL专属的BEGIN...END块结构,SQL语言的函数不支持这种语法,因此引发语法报错。
此外还有一个潜在的类型错误:date_trunc函数的第二个参数需要是timestamptz(或兼容的时间类型),直接传入text类型会导致执行时类型不匹配错误,需要补充类型转换。
两种修正方案
方案1:改用PL/pgSQL语言
将LANGUAGE sql改为LANGUAGE plpgsql,同时补充类型转换:
CREATE OR REPLACE FUNCTION to_tstz_immutable(t text) RETURNS timestamptz LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE $func$ BEGIN RETURN date_trunc('hour', t::timestamptz); END $func$;
方案2:保留SQL语言简化函数体
SQL语言的函数不需要BEGIN...END,直接写查询表达式即可,同时补充类型转换:
CREATE OR REPLACE FUNCTION to_tstz_immutable(t text) RETURNS timestamptz LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE $func$ SELECT date_trunc('hour', t::timestamptz); $func$;
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

