Reputation: 230048
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
Reputation: 8129
You can simply augment the following jdbc url parameter to your connection string
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
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
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