Liquibase错误[Postgresql]:位于或接近“$BODY$”的未终止美元引号字符串

u59ebvdq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(8)|浏览(253)
Liquibase error: unterminated dollar-quoted string at or near "$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: 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$

感谢你帮我解决这个问题

w8rqjzmb

w8rqjzmb1#

几天前我也遇到了同样的问题。
如果我们使用以下格式将变更集添加到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的简要解释。

mfuanj7w

mfuanj7w2#

下面的解决方案来自official Liquibase forum
如果你想完全使用SQL changelog,这个解决方案可以很好地工作(测试和确认):

如果您使用的是SQL Changelog文件,则可以将$ Sign替换为Single Quote,将Single Quote替换为Double 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;'
ctzwtxfj

ctzwtxfj3#

<changeSet>定义中使用<createProcedure>标记而不是<sql>

56lgkhnf

56lgkhnf4#

splitStatements:false添加到变更集
像这个--changeset splitStatements:false

bvk5enib

bvk5enib5#

我在使用sql-maven-plugin时也遇到过类似的错误。添加以下属性修复了问题

<execution>
    ...
    <configuration>
        ...
        <delimiter>/</delimiter>
        <delimiterType>normal</delimiterType>
    </configuration>
</execution>
iswrvxsc

iswrvxsc6#

如果您使用的是SQL更改日志文件,则可以将$ Sign替换为Single Quote,将Single Quote替换为double Single Quote ''

8ljdwjyq

8ljdwjyq7#

可以将splitStatements属性设置为false以避免此错误

<changeSet author="authour_name" id="your_id">
    <sql splitStatements="false">
    ...
    </sql>
</changeSet>
2admgd59

2admgd598#

我也犯了同样的错误。将$function$$body$替换为$$解决了问题。

相关问题