diff --git a/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java b/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java index fbcde81be77..108d9a8a96d 100644 --- a/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java +++ b/liquibase-core/src/main/java/liquibase/change/AbstractSQLChange.java @@ -4,13 +4,14 @@ import liquibase.Scope; import liquibase.GlobalConfiguration; import liquibase.database.Database; +import liquibase.database.core.Db2zDatabase; import liquibase.database.core.MSSQLDatabase; -import liquibase.database.core.PostgresDatabase; import liquibase.exception.DatabaseException; import liquibase.exception.UnexpectedLiquibaseException; import liquibase.exception.ValidationErrors; import liquibase.exception.Warnings; import liquibase.statement.SqlStatement; +import liquibase.statement.core.RawCompoundStatement; import liquibase.statement.core.RawSqlStatement; import liquibase.util.StringUtil; @@ -249,7 +250,11 @@ public SqlStatement[] generateStatements(Database database) { escapedStatement = statement; } - returnStatements.add(new RawSqlStatement(escapedStatement, getEndDelimiter())); + if (database instanceof Db2zDatabase && escapedStatement.toUpperCase().startsWith("CALL")) { + returnStatements.add(new RawCompoundStatement(escapedStatement, getEndDelimiter())); + } else { + returnStatements.add(new RawSqlStatement(escapedStatement, getEndDelimiter())); + } } return returnStatements.toArray(new SqlStatement[returnStatements.size()]); diff --git a/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java b/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java index 4493a8f4a39..3a0e69ffebd 100644 --- a/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java +++ b/liquibase-core/src/main/java/liquibase/executor/jvm/JdbcExecutor.java @@ -26,6 +26,7 @@ import liquibase.util.StringUtil; import java.sql.*; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -359,8 +360,13 @@ private void executeDb2ZosComplexStatement(SqlStatement sqlStatement) throws Dat } else { Statement stmt = null; try { - stmt = ((JdbcConnection) con).getUnderlyingConnection().createStatement(); - stmt.execute(sql.toSql()); + if (sqlStatement instanceof CompoundStatement) { + stmt = ((JdbcConnection) con).getUnderlyingConnection().prepareStatement(sql.toSql()); + ((PreparedStatement)stmt).execute(); + } else { + stmt = ((JdbcConnection) con).getUnderlyingConnection().createStatement(); + stmt.execute(sql.toSql()); + } con.commit(); } finally { JdbcUtil.closeStatement(stmt); diff --git a/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java b/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java new file mode 100644 index 00000000000..e839a099b6c --- /dev/null +++ b/liquibase-core/src/main/java/liquibase/statement/core/RawCompoundStatement.java @@ -0,0 +1,14 @@ +package liquibase.statement.core; + +import liquibase.statement.CompoundStatement; + +public class RawCompoundStatement extends RawSqlStatement implements CompoundStatement { + + public RawCompoundStatement(String sql) { + super(sql); + } + + public RawCompoundStatement(String sql, String endDelimiter) { + super(sql, endDelimiter); + } +}