Запросы, возвращающие несколько результирующих наборов - PullRequest
20 голосов
/ 14 марта 2012

У меня есть база данных MSSQL, и я выполняю следующий запрос:

select * from projects; select * from user

Приведенный выше запрос возвращает два набора результатов одновременно, и я не могу запустить оба запроса по отдельности.Как я могу обработать оба набора результатов одновременно в классе Java?

Ответы [ 7 ]

23 голосов
/ 22 октября 2015

Исправьте код для обработки нескольких ResultSet с, возвращаемых оператором JDBC:

PreparedStatement stmt = ...;
boolean isResultSet = stmt.execute();

int count = 0;
while(true) {
    if(isResultSet) {
        rs = stmt.getResultSet();
        while(rs.next()) {
            processEachRow(rs);
        }

        rs.close();
    } else {
        if(stmt.getUpdateCount() == -1) {
            break;
        }

        log.info("Result {} is just a count: {}", count, stmt.getUpdateCount());
    }

    count ++;
    isResultSet = stmt.getMoreResults();
}

Важные биты:

  • getMoreResults() и execute() возвращают false, чтобы указать, что результатом оператора является просто число, а не ResultSet.
  • Вам нужно проверить stmt.getUpdateCount() == -1, чтобы узнать, есть ли еще результаты.
  • Убедитесь, что вы закрыли наборы результатов или используете stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)
11 голосов
/ 11 сентября 2013

Вы можете использовать Statement.execute (), getResultSet ();

PreparedStatement stmt = ... prepare your statement result
boolean hasResults = stmt.execute();
while (hasResults) {
    ResultSet rs = stmt.getResultSet();
    ... your code parsing the results ...
    hasResults = stmt.getMoreResults();
}
3 голосов
/ 28 января 2016

Да, Вы можете. Смотрите эту статью MSDN https://msdn.microsoft.com/en-us/library/ms378758(v=sql.110).aspx

public static void executeStatement(Connection con) {
   try {
      String SQL = "SELECT TOP 10 * FROM Person.Contact; " +
                   "SELECT TOP 20 * FROM Person.Contact";
      Statement stmt = con.createStatement();
      boolean results = stmt.execute(SQL);
      int rsCount = 0;

      //Loop through the available result sets.
     do {
        if(results) {
           ResultSet rs = stmt.getResultSet();
           rsCount++;

           //Show data from the result set.
           System.out.println("RESULT SET #" + rsCount);
           while (rs.next()) {
              System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
           }
           rs.close();
        }
        System.out.println();
        results = stmt.getMoreResults();
        } while(results);
      stmt.close();
      }
   catch (Exception e) {
      e.printStackTrace();
   }
}

Я проверял это, и он отлично работает.

0 голосов
/ 16 декабря 2016

Перед использованием Java, вам нужно взглянуть на предложение RESULT SETS.

MSSQL имеет эту функцию, которая может помочь вам с вашим Java-кодом, более практичным способом.

В этом примере будут выполнены два запроса:

EXEC('SELECT id_person, name, age FROM dbo.PERSON; SELECT id_url, url FROM dbo.URL;')
WITH RESULT SETS
(
  (
    id_person BIGINT,
    name VARCHAR(255),
    age TINYINT
  ),
  (
    id_url BIGINT,
    url VARCHAR(2000)
  )
);

Вы также можете использовать хранимые процедуры с наборами РЕЗУЛЬТАТОВ.

Подробнее о: https://technet.microsoft.com/en-us/library/ms188332(v=sql.110).aspx

0 голосов
/ 29 июля 2015
public static void executeProcedure(Connection con) {
   try {
      CallableStatement stmt = con.prepareCall(...);
      .....  //Set call parameters, if you have IN,OUT, or IN/OUT parameters

      boolean results = stmt.execute();
      int rsCount = 0;

      //Loop through the available result sets.
     while (results) {
           ResultSet rs = stmt.getResultSet();
           //Retrieve data from the result set.
           while (rs.next()) {
        ....// using rs.getxxx() method to retieve data
           }
           rs.close();

        //Check for next result set
        results = stmt.getMoreResults();
      } 
      stmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}
0 голосов
/ 31 марта 2012

Ответ: НЕ возможно. Единственный способ: запускать их как отдельные запросы.

0 голосов
/ 14 марта 2012

Запрос UNION ALL позволяет вам комбинировать результирующие наборы из 2 или более «выбранных» запросов.Он возвращает все строки (даже если строка существует в более чем одном из операторов "select").

Каждый оператор SQL в запросе UNION ALL должен иметь одинаковое количество полей в наборах результатов с аналогичными даннымитипы .........

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