MSSQL
データベースがあり、次のクエリを実行しています。
select * from projects; select * from user
上記のクエリは2つの結果セットを一度に返します。両方のクエリを個別に起動することはできません。 Javaクラスで両方の結果セットを一度に処理するにはどうすればよいですか?
JDBCステートメントによって返された複数のResultSet
sを処理するための正しいコード:
_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)
を使用してください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();
}
はい、できます。この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();
}
}
私はそれをテストしました、そしてそれはうまく働きます。
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();
}
}
Javaを使用する前に、RESULT SETS句を確認する必要があります。
MSSQLにはこの機能があり、Javaコードをより実用的な方法で支援します。
この例では、2つのクエリを実行します。
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)
)
);
RESULT SETSでストアドプロシージャを使用することもできます。
詳細: https://technet.Microsoft.com/en-us/library/ms188332(v = sql.110).aspx