ripper234
ripper234

Reputation: 230048

Running multiple SQL statements from Groovy

I'm having problems running multiple SQL statements in one activaction from Groovy.

sql = Sql.newInstance("jdbc:mysql://localhost/", "usre", "pass", "com.mysql.jdbc.Driver")
sql.execute("USE foo; "); // this works
sql.execute("USE foo; USE foo;"); // this fails miserably

The error I'm getting is "You have an error in your SQL syntax". What gives?

Upvotes: 6

Views: 9058

Answers (3)

btiernay
btiernay

Reputation: 8129

You can simply augment the following jdbc url parameter to your connection string

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html#allowMultiQueries

From the docs:

Allow the use of ';' to delimit multiple queries during one statement (true/false), defaults to 'false'

For example:

Sql.newInstance("jdbc:mysql://localhost?allowMultiQueries=true", "usre", "pass", "com.mysql.jdbc.Driver")

Upvotes: 9

ripper234
ripper234

Reputation: 230048

Paul King, one of the Groovy developers, commented on the issue I opened that you can tell mysql to allow multiple statements (this is not necessarily supported by other RDBMS)

Upvotes: 0

ripper234
ripper234

Reputation: 230048

The problem is because groovy uses JDBC's Statement.execute(), which expects on statement. Here is a replacement class for Groovy's Sql that works around this problem (but lacks in functionality)

/**
 * Not related to mysql, just to distinguish it from Groovy's Sql class
 * Created to solve this problem: http://stackoverflow.com/questions/4286483/running-multiple-sql-statements-from-groovy
 */
public class MySql {
  private final String password;
  private final String connectionString;
  private final String user;

  public static newInstance(String connectionString, String user, String password, String driverName) {
    Class.forName(driverName).newInstance();
    return new MySql(connectionString, user, password);
  }

  public MySql(String connectionString, String user, String password) {
    this.connectionString = connectionString;
    this.user = user;
    this.password = password;
  }

  void execute(String query) {
    Connection conn = DriverManager.getConnection(connectionString, user, password);
    try {
      Statement statement = conn.createStatement();
      for (String subQuery : query.split(";"))
      {
        if (subQuery.trim() == '')
          continue;

        statement.addBatch subQuery
      }
      statement.executeBatch();
    }
    finally {
      conn.close();
    }
  }
}

Upvotes: 1

Related Questions