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['&', '<', '>', '"'];
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$ 替换为 '
来修复它,因为它的主体内部有 $
,所以我得到了相同的未终止美元报价,但在另一个地方。
有什么方法可以解决吗?
基于@a_horse_with_no_name评论的回答:splitStatements=false
可以用来解决这个问题。
SQL 更新日志声明:--changeset name:id splitStatements:false
另外:
- 如果您有多个函数要声明,则必须在单独的变更集中进行声明;
- 当使用
splitStatements=false
. 时,您可以不将 '$body$' 替换为 '
我有两个函数想使用 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['&', '<', '>', '"'];
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$ 替换为 '
来修复它,因为它的主体内部有 $
,所以我得到了相同的未终止美元报价,但在另一个地方。
有什么方法可以解决吗?
基于@a_horse_with_no_name评论的回答:splitStatements=false
可以用来解决这个问题。
SQL 更新日志声明:--changeset name:id splitStatements:false
另外:
- 如果您有多个函数要声明,则必须在单独的变更集中进行声明;
- 当使用
splitStatements=false
. 时,您可以不将 '$body$' 替换为
'