【问题标题】:Liquibase error [Postgresql]: unterminated dollar-quoted string at or near "$BODY$Liquibase 错误 [Postgresql]:"$BODY$" 处或附近未终止的美元引号字符串
【发布时间】:2016-06-14 13:45:18
【问题描述】:
Liquibase error: unterminated dollar-quoted string at or near "$BODY$`

更改日志 xml 有一个条目:见下文 包含文件="/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: Error executing SQL CREATE OR REPLACE FUNCTION function name()
ETURNS smallint AS
$BODY$
   DECLARE
      v_next_gen_id smallint := 0: ERROR: unterminated dollar-quoted string at or near "$BODY$

感谢任何帮助解决此问题

【问题讨论】:

标签: java postgresql plpgsql liquibase


【解决方案1】:

几天前我刚刚遇到了同样的问题。

如果我们使用以下格式将变更集添加到 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 进行简要说明的链接。

【讨论】:

  • 如果您不想定义 sql 脚本文件的绝对路径,可以使用属性:relativeToChangelogFile="true"
  • @shaohua-huang 你救了我的命,谢谢伙计!
  • 所以关键是有splitStatements="false",为什么我什至需要拆分语句。 False 应该是默认值。
【解决方案2】:

在您的&lt;changeSet&gt; 定义中使用&lt;createProcedure&gt; 标签而不是&lt;sql&gt;

【讨论】:

  • 能否解释一下为什么您的解决方案可以提高您贡献的价值?
【解决方案3】:

下面的解决方案来自official Liquibase forum

如果您想完全使用 SQL 更改日志,此解决方案可以正常工作(经过测试和确认):

如果您使用的是 SQL 变更日志文件,那么您可以将 $ 符号替换为单引号并将单引号替换为双引号 ''

所以要详细说明:

  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;'

【讨论】:

  • 这行得通的原因是什么?
  • @danbtl 当我们谈论 postgresql 时,它似乎与美元报价有关。由于某种原因,使用 $$/$BODY$ 不能与 liquibase 正常工作(我不确定他们在将 sql 输入数据库之前是否进行了任何预处理)
【解决方案4】:

如果您使用的是 SQL 变更日志文件,那么您可以将 $ 符号替换为单引号,将单引号替换为双单引号 ''

【讨论】:

    【解决方案5】:

    我有同样的错误。将$function$$body$ 替换为$$ 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2015-12-14
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多