我们使用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文件中的分隔符?
答案 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投票,如果有的话。