Liquibase错误:未结算的美元引用字符串在或附近" $ BODY $`
Chaneg log xml有一个条目:见下文 include file =" / home / dev /....../ admin_script.sql"
文件内容:
...............
CREATE OR REPLACE FUNCTION my_schema.function-name()
RETURNS smallint AS
$BODY$
DECLARE
v_next_gen_id smallint := 0;
BEGIN
..........
例外:
liquibase.exception.DatabaseException:执行SQL CREATE或REPLACE FUNCTION函数名称()时出错 ETURNS smallint AS $ BODY $ 宣布 v_next_gen_id smallint:= 0:错误:未终止的美元引用字符串在或附近" $ BODY $
感谢您解决此问题的任何帮助
答案 0 :(得分:6)
我刚刚在几天前遇到过同样的问题。
如果我们使用以下格式将changeset添加到changelog.xml文件中,它将不起作用:
<include file="path/to/sqlfile" />
要解决此问题,我使用其他格式:
<changeSet author="authour_name" id="your_id">
<sqlFile path="path/to/sqlfile" splitStatements="false"/>
</changeSet>
这是给Problem with dollar-quoted-in-postgresql提供简要说明的链接。
答案 1 :(得分:3)
以下解决方案来自official Liquibase forum。
如果您想完全使用 SQL 更改日志,此解决方案工作正常(经过测试和确认):
如果您使用的是 SQL Changelog 文件,那么您可以将 $
Sign with Single Quote 和 Single Quote 替换为双单引号 ''
详细说明:
$
将是 '
$BODY$
将是 '
'
将是 ''
示例:
CREATE OR REPLACE FUNCTION public.testingfunctions()
RETURNS TABLE("DistributorCode" character varying)
LANGUAGE plpgsql
AS '
begin
RETURN QUERY
select * from testtable;
-- .
-- .
-- . somewhere in the function
RAISE NOTICE ''OPEN deleted customer_avatar'';
END;'
答案 2 :(得分:2)
在<createProcedure>
定义
<sql>
代码而不是<changeSet>
答案 3 :(得分:0)
我有同样的错误。用$$替换$ function $和$ body $可以解决问题
答案 4 :(得分:0)
如果您使用的是 SQL Changelog 文件,那么您可以将 $ Sign 替换为单引号,将单引号替换为双单引号 ''