Liquibase : $BODY$ 或附近的未终止的美元引号字符串

Posted

技术标签:

【中文标题】Liquibase : $BODY$ 或附近的未终止的美元引号字符串【英文标题】:Liquibase : unterminated dollar-quoted string at or near $BODY$ 【发布时间】:2017-07-20 06:36:49 【问题描述】:

您好,我正在努力解决该主题的问题。我有以下变更集:

 <changeSet author="artur" id="storedProcedures-0003">

        <sqlFile dbms="postgresql"
                 encoding="utf8"
                 path="server/sql/storedProcedures/postgresql/procedure.sql"
                 relativeToChangelogFile="true"
                 splitStatements="false"
        />
    </changeSet>

我的程序是:

CREATE FUNCTION testProc(oRefCursor          OUT  REFCURSOR)

AS $BODY$
DECLARE
    minLevel        INTEGER;
    defDcId         DECIMAL(19);
BEGIN

END;
$BODY$ LANGUAGE plpgsql;

此过程与 pgAdmin 工具一起工作正常,但在 liquibase 中我总是得到错误。我试图找到并回答,但 this 和 this 也不适合我。我在单独的文件中有这个过程,我使用splitStatements="false",但没有任何帮助。我总是收到这个错误。有谁知道这个问题的解决方法(这是 Liquibase 问题吗?)。我试图在一行中写这个,我试图使用斜线但没有成功。

【问题讨论】:

哪个 Liquibase 版本? @a_horse_with_no_name Liquibase 3.5.3 【参考方案1】:

liquibase 的一个非常好的解决方法是使用不同的分隔符。我个人的选择只是双分号。

CREATE FUNCTION exampleFunction()
AS
$BODY$
BEGIN
    SELECT 1;
END;
$BODY$ 
    LANGUAGE plpgsql;;
<changeSet id="1" author="author">
    <sqlFile path="example.sql" endDelimiter=";;"/>
</changeSet>

【讨论】:

为我工作。有点傻 - 但它完成了工作。【参考方案2】:

我发现了这种行为的原因。在我的项目中,硬编码了一些旧版本的 postgresql 驱动程序。我已经切换到最新的(42.1.3),现在一切都很好。我的意思是很好,但仍然在 Liquibase 我需要在我的问题中描述的单独文件中使用过程 sql 的解决方法

【讨论】:

以上是关于Liquibase : $BODY$ 或附近的未终止的美元引号字符串的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase ERROR 数据库 URL 未指定为参数或属性文件

Elasticsearch 的 Liquibase 或 Flyway 数据库迁移替代方案

Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?

Flyway 或 LiquiBase 可以在当前数据库和最新迁移之间进行区分吗?

Liquibase 如何为 oracle 映射布尔值?

Liquibase maven插件不起作用