为什么psql可正常编译的函数在DBeaver中报美元符未终止错误
错误原因
该报错是DBeaver的默认SQL语句拆分规则和PostgreSQL的美元引用语法不兼容导致的:
- psql客户端原生支持PostgreSQL的
$$美元引用语法,会自动识别$$包裹的所有内容属于同一段CREATE FUNCTION语句,不会被代码内部的分号拆分 - DBeaver默认以分号
;作为单条SQL的分隔符,执行时如果没有选中全量代码,会自动将整段代码按分号拆分执行:拆分后最后一段会变成单独的$$;,系统识别到没有对应的起始$$,就会抛出「未终止的美元引用」的42601错误。
你执行的相关代码及报错如下:
SQL Error [42601]: Unterminated dollar quote started at position 0 in SQL $$;. Expected terminating $$.
CREATE OR REPLACE FUNCTION numOf_icd10cm_4_snomed(oldCode TEXT) RETURNS integer LANGUAGE plpgsql AS $$ -- This function returns the nunber of icd10cm codes matching oldCode in the table snomed2icd10 DECLARE quantity integer; BEGIN quantity := (select count(maptarget) from snomed2icd10 where referencedcomponentid = oldCode ); return quantity; END; $$;
解决方案
- 临时方案:选中整段CREATE FUNCTION的全部代码(从CREATE开头到最后一个分号结束),再点击执行按钮,DBeaver会直接执行选中的完整内容,不会自动拆分
- 永久方案:修改连接配置,右键对应PostgreSQL连接 -> 编辑连接 -> 选择「SQL编辑器」->「SQL处理」,开启「在美元引号中忽略分号」选项,保存后重启连接即可
内容的提问来源于stack exchange,提问作者Jose Cabrera Zuniga
相关产品推荐
相关产品推荐

