Использование нескольких результирующих наборов
При работе со встроенным кодом SQL или хранимыми процедурами SQL Server, которые возвращают несколько результирующих наборов, Microsoft JDBC Driver для SQL Server предоставляет в классе SQLServerStatement метод getResultSet для получения каждого возвращенного набора данных. Кроме того, при выполнении инструкции, которая возвращает несколько результирующих наборов, можно использовать метод execute класса SQLServerStatement. Он возвращает логическое значение, указывающее, чем является возвращенное значение: результирующим набором или числом обновлений.
Если метод execute возвращает значение true, то выполненная инструкция возвратила один или несколько результирующих наборов. Доступ к первому результирующему набору можно получить, вызвав метод getResultSet. Чтобы определить, есть ли еще доступные результирующие наборы, можно вызвать метод getMoreResults, который возвращает логическое значение true, если доступны также другие результирующие наборы. Если доступно большее число результирующих наборов, можно снова вызвать метод getResultSet, чтобы получить к ним доступ. Эту процедуру можно продолжать до тех пор, пока не будут обработаны все результирующие наборы. Если метод getMoreResults возвращает значение false, значит больше нет доступных для обработки результирующих наборов.
Если метод execute возвращает false, то выполненная инструкция возвратила значение числа обновлений, которое можно получить с помощью метода getUpdateCount.
Примечание.
Дополнительные сведения о счетчиках обновлений см. в статье Использование хранимых процедур со счетчиком обновлений.
В следующем примере открытое подключение к образцу базы данных AdventureWorks2022 передается в функцию, а инструкция SQL создается, что при выполнении возвращает два результирующих набора:
public static void executeStatement(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * FROM Person.Contact; SELECT TOP 20 * FROM Person.Contact";
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"));
}
}
System.out.println();
results = stmt.getMoreResults();
} while (results);
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
В этом случае известно, что количество результирующих наборов равно двум. Но этот код написан таким образом, что даже если количество возвращенных результирующих наборов было бы неизвестно, как при вызове хранимой процедуры, все они были бы обработаны. См. пример вызова хранимой процедуры, которая возвращает несколько результирующих наборов наряду со значениями обновления, в руководстве по обработке сложных инструкций.
Примечание.
При вызове метода getMoreResults класса SQLServerStatement возвращенный ранее результирующий набор неявно закрывается.