Liquibase错误[Postgresql]:未终止的美元引用字符串在或附近" $ BODY $

时间:2016-03-01 22:23:04

标签: java liquibase

  

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 $

感谢您解决此问题的任何帮助

5 个答案:

答案 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 替换为双单引号 ''

详细说明:

  1. $ 将是 '
  2. $BODY$ 将是 '
  3. ' 将是 ''

示例:

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 替换为单引号,将单引号替换为双单引号 ''