Запуск нескольких операторов SQL из Groovy - PullRequest
5 голосов
/ 26 ноября 2010

У меня проблемы с запуском нескольких операторов SQL в одной активации из 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

Я получаю сообщение об ошибке «В синтаксисе SQL есть ошибка».Что дает?

Ответы [ 3 ]

8 голосов
/ 02 декабря 2010

Вы можете просто добавить следующий параметр URL-адреса jdbc в строку подключения

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

Из документов:

Разрешить использование ';'для разделения нескольких запросов во время одного оператора (true / false), по умолчанию используется значение «false»

Например:

Sql.newInstance("jdbc:mysql://localhost?allowMultiQueries=true", "usre", "pass", "com.mysql.jdbc.Driver")
1 голос
/ 27 ноября 2010

Проблема в том, что groovy использует оператор Statement.execute () JDBC, который ожидает оператор. Вот класс замены для Groovy Sql, который работает вокруг этой проблемы (но не имеет функциональности)

/**
 * Not related to mysql, just to distinguish it from Groovy's Sql class
 * Created to solve this problem: /3845506/zapusk-neskolkih-operatorov-sql-iz-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();
    }
  }
}
0 голосов
/ 27 ноября 2010

Пол Кинг, один из разработчиков Groovy, прокомментировал проблему, которую я открыл, что вы можете указать mysql разрешить несколько операторов (это не обязательно поддерживается другими СУБД)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...