2015-06-17 62 views
0

我們使用Flyway作爲數據庫遷移工具。 現在我們想用它來在我們的數據庫上執行一些import語句。Flyway DB2 change delimiter NOT WORKING

在數據中有一些存儲過程和命令包含「;」字符。

所以我們想改變sql腳本中的分隔符。

在IBM Data Studio中我用下面的SQL代碼來實現這一點:

--#SET TERMINATOR @ 

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

--#SET TERMINATOR ; 

但是,當我嘗試使用的飛行路線來執行這個代碼,我得到了以下錯誤消息:

[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文件中的分隔符?

回答

3

在DB2中沒有可用於設置語句分隔符的SQL語句。

語法--#SET TERMINATOR x特定於DB2命令行處理器,並且Data Studio爲了兼容性實現了它(推測)。

似乎必須修改Flyway以支持DB2的不同語句終結符。

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); 
} 

這樣我就可以使用DB2分隔符在我的SQL數據源。在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