恢复PostgreSQL Schema时遭遇语法错误,请求技术支持
PostgreSQL函数创建SQL语法错误排查与解决
问题场景
导出的Repo Dump包含如下创建函数的SQL代码:
-- -- Name: add_em(integer, integer); Type: FUNCTION; Schema: public; Owner: developer -- CREATE FUNCTION public.add_em(x integer, y integer) RETURNS integer LANGUAGE sql AS $ $ SELECT x + y; $ $; ALTER FUNCTION public.add_em(x integer, y integer) OWNER TO developer;
执行psql -f命令恢复数据库时,出现如下错误:
psql:lib/scripts/repo/structure:87: ERROR: syntax error at or near "$"
LINE 1: ...em(x integer, y integer) RETURNS integer LANGUAGE sql AS $ $
错误原因
PostgreSQL的**美元引号(Dollar Quoting)**语法要求,分界符的$符号之间不能有空格。原代码里的$ $(两个$中间有空格)不符合语法规范,数据库无法正确识别函数体的起始和结束标记,因此抛出语法错误。
修复方案
将SQL代码中的$ $替换为无空格的$$即可,修复后的代码如下:
-- -- Name: add_em(integer, integer); Type: FUNCTION; Schema: public; Owner: developer -- CREATE FUNCTION public.add_em(x integer, y integer) RETURNS integer LANGUAGE sql AS $$ SELECT x + y; $$; ALTER FUNCTION public.add_em(x integer, y integer) OWNER TO developer;
如果需要避免函数体内部的$$冲突,也可以给美元引号添加自定义标签,比如$add_em_func$,示例如下:
CREATE FUNCTION public.add_em(x integer, y integer) RETURNS integer LANGUAGE sql AS $add_em_func$ SELECT x + y; $add_em_func$;
内容的提问来源于stack exchange,提问作者bezzoon
相关产品推荐
相关产品推荐

