Liquibase:PSQL异常:使用 SQL 变更日志的未终止美元

Liquibase: PSQLException: Unterminated dollar using SQL Changelog

我有两个函数想使用 liquibase 添加到我的数据库中。 第一个是:

--changeset polos:001_9
create or replace function xml_attribute_element(attribute_name varchar(255), source numeric)
    returns xml as $body$
declare

begin
    return xml_attribute_element(attribute_name, source::text);
end;
$body$
    language plpgsql immutable;

我在 "$BODY$ 错误处或附近得到了未终止的美元引号字符串,并使用此处描述的方法 https://forum.liquibase.org/t/unterminated-dollar-quote-started/4553 修复了它。现在它可以工作了,看起来像:

--changeset polos:001_9
create or replace function xml_attribute_element(attribute_name varchar(255), source numeric)
    returns xml as '
declare

begin
    return xml_attribute_element(attribute_name, source::text);
end;
'
    language plpgsql immutable;

第二个函数是:

--changeset polos:001_10
create or replace function xml_text_escape(source text)
    returns text as $body$
declare
    sa varchar[] := array['&', '<', '>', '"'];
    da varchar[] := array['&amp;', '&lt;', '&gt;', '&quot;'];
    t text := source;
begin
    FOR i IN 1..array_length(sa, 1) LOOP
            t := replace(t, sa[i], da[i]);
        END LOOP;
    return t;
end;
$body$
    language plpgsql immutable;

我无法通过将 $body$ 替换为 ' 来修复它,因为它的主体内部有 $,所以我得到了相同的未终止美元报价,但在另一个地方。

有什么方法可以解决吗?

这里是游乐场:https://www.db-fiddle.com/f/kpmP1y7U4UvUhbgahuQrQc/1

基于@a_horse_with_no_name评论的回答:splitStatements=false可以用来解决这个问题。

SQL 更新日志声明:--changeset name:id splitStatements:false

另外:

  1. 如果您有多个函数要声明,则必须在单独的变更集中进行声明;
  2. 当使用 splitStatements=false.
  3. 时,您可以不将 '$body$' 替换为 '