org.postgresql.util.PSQLException:错误:未终止的美元引用字符串为“$ BODY $”

时间:2013-09-21 01:19:46

标签: postgresql dbunit

我正在尝试在我的java项目中使用dbunit-express在Junit测试中在postgress上创建一些表和函数。

我使用这个驱动程序:

<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1003-jdbc4</version>

java class ...

@Rule 
public EmbeddedDbTesterRule testDb = new EmbeddedDbTesterRule(); // with this you don't neet to call onSetup

@Test
public void testIt() throws Exception {

    try {
        DatabaseCreator databaseCreator = new DatabaseCreator();
        databaseCreator.setDdlFile("HistoryTables.ddl");
        databaseCreator.doCreateDbSchemaFromDdl(testDb.getSqlConnection());
    } catch (Exception e) {
        Assert.fail(e.getMessage());
    }
}

但是我得到了这个错误...

org.postgresql.util.PSQLException:错误:未终止的美元引用字符串位于或接近“$ BODY $

该功能如下所示。

CREATE OR REPLACE FUNCTION product_history()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO product_history (id, product_id, edit_ts, name, print_provider_id,     description)
    VALUES (nextval('product_history_sequence'), OLD.id, now(), OLD.name,     OLD.print_provider_id, OLD.description);
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql;

创建在PGAdmin 1.14.3和DBVisualizer 9.0.8中正常工作

1 个答案:

答案 0 :(得分:1)

create function中是否包含HistoryTables.ddl代码?如果是,则错误可能是由DatabaseCreator的限制引起的。它将从;处的ddl文件中读取的语句拆分(请参阅line 127 of the source code。因此,该函数被拆分为多个语句,干扰语法。

尝试将功能代码移动到一个额外的文件中,并将此文件作为一个语句发送到您的服务器。