複数の結果セットの使用
複数の結果セットを返すインライン SQL または SQL Server ストアド プロシージャを処理する場合、返される各データのセットを取得するために、Microsoft JDBC Driver for SQL Server は SQLServerStatement クラスの getResultSet メソッドを提供します。 また、複数の結果セットを返すステートメントの実行時には、SQLServerStatement クラスの execute メソッドを使用できます。これは、返される値が結果セットと更新数のどちらであるかを示す boolean 値を返せるためです。
execute メソッドから true が返された場合、実行されたステートメントから返されるのは 1 つ以上の結果セットです。 最初の結果セットには、getResultSet メソッドを呼び出すことでアクセスできます。 他にも使用可能な結果セットがあるかどうかを判断するには、getMoreResults メソッドを呼び出すことができます。このメソッドでは、他にも使用可能な結果セットがある場合、boolean 値として true が返されます。 他にも結果セットが使用可能な場合は、getResultSet メソッドを再度呼び出して結果セットにアクセスし、すべての結果セットが処理されるまで続けます。 getMoreResults メソッドから false が返された場合は、処理対象となる結果セットがなくなったことを意味します。
execute メソッドから false が返された場合、実行されたステートメントから返されるのは更新数の値です。更新数の値は、getUpdateCount メソッドを呼び出すことで取得できます。
Note
更新数の詳細については、「更新数があるストアド プロシージャの使用」を参照してください。
次の例では、AdventureWorks2022 サンプル データベースへのオープン接続が関数に渡され、実行すると 2 つの結果セットを返す 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();
}
}
この例では、返される結果セット数は 2 であることがわかっています。 ただし、ストアド プロシージャを呼び出す場合のように、返される結果セット数が不明でも、すべての結果セットが処理されるようにコードが作成されています。 複数の結果セットと更新数を返すストアド プロシージャを呼び出す例については、「複雑なステートメントの処理」を参照してください。
Note
SQLServerStatement クラスの getMoreResults メソッドを呼び出すと、前に返された結果セットは暗黙的に閉じられます。