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

Vib*_*bin 10 java liquibase

Liquibase错误:未结合美元引用的字符串在"$ BODY $"或附近

Chaneg log xml有一个条目:见下面包括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
..........
Run Code Online (Sandbox Code Playgroud)

例外:

liquibase.exception.DatabaseException:执行SQL时出错CREATE OR REPLACE FUNCTION函数名称()ETURNS smallint AS $ BODY $ DECLARE v_next_gen_id smallint:= 0:错误:未终止的美元引用字符串处于或接近"$ BODY $

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

coo*_*ool 26

以下解决方案来自Liquibase 官方论坛

如果你想完全使用 SQL 变更日志,这个解决方案可以很好地工作(经过测试和确认):

如果您使用的是 SQL Changelog 文件,则可以将$Sign with Single Quote 替换为 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;'
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。请参阅 https://forum.liquibase.org/t/untermminate-dollar-quote-started/4553/3 (4认同)

Mis*_*ger 14

添加splitStatements:false到变更集

像这样--changeset splitStatements:false


小智 13

在您的定义中使用<createProcedure>标签而不是<sql><changeSet>

  • 能否解释为什么您的解决方案有效以提高您的贡献价值? (2认同)

Sha*_*ang 8

我刚刚在几天前遇到过同样的问题.

如果我们使用以下格式将changeset添加到changelog.xml文件中,它将不起作用:
<include file="path/to/sqlfile" />

为了解决,我使用另一种格式:

<changeSet author="authour_name" id="your_id">
    <sqlFile path="path/to/sqlfile" splitStatements="false"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

这是一个链接,它给出了带有美元引用的postgresql问题的简要解释.

  • 所以关键点是 splitStatements="false",为什么我什至需要拆分语句。False 应该是默认值。 (4认同)