複雑なステートメントの処理
Microsoft SQL Server 2005 JDBC Driver を使用するときは、実行時に動的に生成されたステートメントなどの複雑なステートメントを処理しなければならないことがあります。 複雑なステートメントは、更新、挿入、および削除などのさまざまなタスクを頻繁に実行します。 これらの種類のステートメントは、複数の結果セットや出力パラメータを返すこともあります。 こうした状況では、ステートメントを実行する Java コードが、返されるデータやオブジェクトの型および数について事前に知らない場合があります。
複雑なステートメントを効率的に処理するため、JDBC ドライバでは、返されるオブジェクトやデータを照会し、アプリケーションがそれらを正しく処理するための多くのメソッドが用意されています。 複雑なステートメントを処理するために重要となるのは、SQLServerStatement クラスの execute メソッドです。 このメソッドでは boolean 値が返されます。 値が true の場合、ステートメントから返される最初の結果は結果セットです。 値が false の場合、返される最初の結果は更新数です。
返されたオブジェクトまたはデータの型がわかっている場合、getResultSet メソッドまたは getUpdateCount メソッドのいずれかを使用してそのデータを処理することができます。 複雑なステートメントから返された次のオブジェクトまたはデータへ進むため、getMoreResults メソッドを呼び出すことができます。
次の例は、SQL Server 2005 AdventureWorks サンプル データベースに対して開いている接続を関数に渡し、ストアド プロシージャ呼び出しと SQL ステートメントを結合する複雑なステートメントを作成して実行します。次に do
ループを使用して、返されたすべての結果セットおよび更新数を処理します。
public static void executeComplexStatement(Connection con) {
try {
String sqlStringWithUnknownResults = "{call dbo.uspGetEmployeeManagers(50)};SELECT TOP 10 * FROM Person.Contact";
Statement stmt = con.createStatement();
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);
rs.close();
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}