Java postgres迁移错误;未终止的美元报价字符串

Java postgres迁移错误;未终止的美元报价字符串,java,postgresql,maven-3,database-migration,Java,Postgresql,Maven 3,Database Migration,这有点奇怪,谁能帮我指出这个函数哪里可能错了。 我有一个类似于的函数 CREATE FUNCTION check_password(uname TEXT, pass TEXT) RETURNS BOOLEAN AS $$ DECLARE passed BOOLEAN; BEGIN SELECT (pwd = $2) INTO passed FROM pwds WHERE username = $1; RETURN pa

这有点奇怪,谁能帮我指出这个函数哪里可能错了。 我有一个类似于的函数

CREATE FUNCTION check_password(uname TEXT, pass TEXT)
RETURNS BOOLEAN AS $$
DECLARE passed BOOLEAN;
BEGIN
        SELECT  (pwd = $2) INTO passed
        FROM    pwds
        WHERE   username = $1;

        RETURN passed;
END;

$$  LANGUAGE plpgsql
当我直接在pgAdmin sql控制台中运行它时,没有错误,但是使用db migration maven plugin在迁移脚本中运行它时,我得到了错误

Error executing: CREATE FUNCTION check_password(uname TEXT, pass TEXT) 
                 RETURNS BOOLEAN AS $$ DECLARE passed BOOLEAN
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted 
                        string at or near "$$ DECLARE passed BOOLEAN"
Position: 74

迁移脚本生成的SQL中可能有某种类型的
$
引号,在某些地方被解释为字符串

一个快速而肮脏的解决方案可能是将
$$
更改为
$func$
,甚至
$check\u password$
,尽管可能还有其他函数会遇到同样的问题


更好、更长期的方法是找到有问题的
$$

@ivanorone:db migration maven插件存在一个bug: 其中包含一个补丁,但从其源代码来看,它并没有真正正确地修复问题。除此之外,该项目似乎处于闲置状态(上一次提交于2010年)

还有另一个插件,我正在尝试使用它,Flyway:切换到它非常简单,到目前为止效果很好。

的解决方案


以单个批处理的方式执行查询(提示:使用ctrl+F5)。当我在PostgresSQL(Greenplum接口)中运行您的查询时,我得到了与上面所述类似的错误。我发现db是通过根据查询中的终止(分号)对查询进行拆分来执行查询的。由于您在查询中已三次终止,它将逐个执行语句。因此,要将其作为一个整体批执行,请在执行选项中使用executeas single batch运行


我希望它能帮助您:):)

最好的解决方案似乎是告诉插件,当分号位于新行时,只接受它作为分隔符。 当您需要像这样定义代码块时,这种方法非常有效


Ref:

起初我也这么认为,将$$更改为$func$,但始终没有helped@ivan_d_coder:失败时显示完全相同的错误消息,或位于不同的位置?请仔细检查正在获取输出的SQL。整个迁移过程都很复杂。其中一定有您没有注意到的未终止字符串,或者其他一些语法错误使字符串看起来未终止。我发现了一件有趣的事情,迁移插件(db migration maven plugin)逐部分运行函数,而不是使用$$指定的作为一个整体运行函数。因此,它会在遇到终止后立即执行语句,而不是将整个块包装在$$$中并作为一个块执行。我现在想知道的是如何使它将$$..$$块中的所有语句作为一个整体执行。很抱歉,现在面临同样的问题。你找到修复它的方法了吗?我避免了一起编写长函数。这是迁移软件(carbonfive)的一个问题。我想对它做一些修改,因为它是开源的,但没有时间修改。我使用Aqua Data Studio(使用Redshift JDBC驱动程序)收到了类似的错误消息。在我的例子中,修复方法是转到“选项”并取消勾选;语句分隔符'。解析器似乎假设第一个分号是整个函数定义的结尾,但它还没有看到结尾$$。取消勾选该框时,在我的系统(9.5版)上创建的示例函数没有错误。用“;“语句分隔符”勾选,我得到了相同的错误。我同意,flywaydb似乎比Carbon5B-migration-maven-plugin更活跃。我没有认真对待,但很快就会看一看。很好用。
changeSet(author: "...", id: "...") {
    sql(splitStatements: false, '''
        CREATE FUNCTION trigger_func() RETURNS TRIGGER AS $$
        DECLARE var text;
        BEGIN
        ...
        END $$ LANGUAGE plpgsql;
    ''')
}