複雑なステートメントの処理
Microsoft JDBC Driver for SQL Server を使用する場合、実行時に動的に生成されるステートメントなど、複雑なステートメントを処理しなければならないことがあります。 複雑なステートメントでは、多くの場合、更新、挿入、削除などのさまざまな種類のタスクが実行されます。 これらの種類のステートメントは、複数の結果セットや出力パラメーターを返すこともあります。 こうした状況では、ステートメントを実行する Java コードが、返されるデータやオブジェクトの型および数について事前に知らない場合があります。
複雑なステートメントを処理するために、JDBC ドライバーには、返されるオブジェクトやデータのクエリを実行するための多くのメソッドが用意されているので、アプリケーションでそれらを正しく処理できます。 複雑なステートメントを処理するために重要となるのは、SQLServerStatement クラスの execute メソッドです。 このメソッドは、ブール値を返します。 値が true の場合、ステートメントから返される最初の結果は結果セットです。 値が false の場合、返される最初の結果は更新数です。
返されるオブジェクトまたはデータの型がわかっている場合、getResultSet または getUpdateCount のいずれかのメソッドを使用してそのデータを処理することができます。 複雑なステートメントから返された次のオブジェクトまたはデータへ進むため、getMoreResults メソッドを呼び出すことができます。
次の例の関数は、AdventureWorks2022 サンプル データベースに対して開かれた接続を渡され、ストアド プロシージャの呼び出しと SQL ステートメントを組み合わせた複雑なステートメントを作成して実行した後、do
ループを使って、返されたすべての結果セットと更新数を処理します。
public static void executeComplexStatement(Connection con) {
try (Statement stmt = con.createStatement();) {
String sqlStringWithUnknownResults = "{call dbo.uspGetEmployeeManagers(50)}; SELECT TOP 10 * FROM Person.Contact";
boolean results = stmt.execute(sqlStringWithUnknownResults);
int count = 0;
do {
if (results) {
ResultSet rs = stmt.getResultSet();
System.out.println("Result set data displayed here.");
}
else {
count = stmt.getUpdateCount();
if (count >= 0) {
System.out.println("DDL or update data displayed here.");
}
else {
System.out.println("No more results to process.");
}
}
results = stmt.getMoreResults();
}
while (results || count != -1);
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}