Flyway DB2更改分隔符无法正常工作

时间:2015-06-17 16:32:16

标签: maven db2 flyway

我们使用Flyway作为数据库迁移工具。 现在我们想用它来在我们的数据库上执行一些import语句。

在数据中包含一些包含&#34 ;;"的存储过程和命令。字符。

所以我们想在sql脚本中更改分隔符。

在IBM Data studio中,我通过以下sql代码实现了这一目的:

--#SET TERMINATOR @

insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(12,'testuser')@

--#SET TERMINATOR ;

但是当我尝试使用flyway执行此代码时,我收到以下错误消息:

 [ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:3.0:migrate (default-cli) on project healthstat-database: org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException: Error executing statement at line 3: insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(6,'testuser')@
 [ERROR] insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(9,'testuser')@
 [ERROR] insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(10,'testuser')@
 [ERROR]
 [ERROR] --#SET TERMINATOR: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601,SQLERRMC=(6,'testuser')@
 [ERROR] insert into;, "USERNAME") values;<space>, DRIVER=3.64.82

是否可以更改sql文件中的分隔符?

2 个答案:

答案 0 :(得分:3)

您无法在DB2中执行SQL语句来设置语句分隔符。

语法--#SET TERMINATOR x特定于DB2命令行处理器,而Data Studio(可能)实现了兼容性。

似乎必须修改Flyway以支持使用DB2的不同语句终结符。

答案 1 :(得分:1)

我重写了类org.flywaydb.core.internal.dbsupport.db2.DB2SqlStatementBuilder 使用代码,部分取自MySQLSqlStatementBuilder:

package org.flywaydb.core.internal.dbsupport.db2;
import org.flywaydb.core.internal.dbsupport.Delimiter;
import org.flywaydb.core.internal.dbsupport.SqlStatementBuilder;

public class DB2SqlStatementBuilder extends SqlStatementBuilder {

private static final String DELIMITER_KEYWORD = "--#SET TERMINATOR";

public DB2SqlStatementBuilder() {
}

@Override
public Delimiter extractNewDelimiterFromLine( String line ) {
    if( line.toUpperCase().startsWith( DELIMITER_KEYWORD ) ) {
        return new Delimiter(
                line.substring( DELIMITER_KEYWORD.length() ).trim(),
                false );
    }

    return null;
}

@Override
protected Delimiter changeDelimiterIfNecessary( String line,
        Delimiter delimiter ) {
    if( line.toUpperCase().startsWith( DELIMITER_KEYWORD ) ) {
        return new Delimiter(
                line.substring( DELIMITER_KEYWORD.length() ).trim(),
                false );
    }

    return delimiter;
}

@Override
protected boolean isSingleLineComment( String line ) {
    return line.startsWith( "--" ) && !line.startsWith( DELIMITER_KEYWORD);
}

所以我可以在我的SQL源代码中使用DB2分隔符。在Web应用程序中,您应该将此类放在Web /类中,以便在flyway.jar放入web / lib之前加载它,因为http://download.oracle.com/otn-pub/jcp/servlet-2.4-fr-spec-oth-JSpec/servlet-2_4-fr-spec.pdf

PS:我创建问题https://github.com/flyway/flyway/issues/1163投票,如果有的话。