【发布时间】:2012-03-30 14:15:25
【问题描述】:
我有一个MSSQL 数据库并且正在运行以下查询:
select * from projects; select * from user
上面的查询一次返回两个结果集,我不能分别触发这两个查询。如何在 Java 类中同时处理两个结果集?
【问题讨论】:
我有一个MSSQL 数据库并且正在运行以下查询:
select * from projects; select * from user
上面的查询一次返回两个结果集,我不能分别触发这两个查询。如何在 Java 类中同时处理两个结果集?
【问题讨论】:
处理 JDBC 语句返回的多个 ResultSets 的正确代码:
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();
}
【讨论】:
boolean 返回值的含义:true 表示下一个结果是ResultSet,而false 表示下一个结果是更新计数(或者,当更新计数为-1,即没有更多结果)。这尤其可能发生在 SQL Server(和 Sybase)上,其中结果集和更新计数可以从存储过程中发出。
是的,你可以。请参阅此 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();
}
}
我已经测试过了,它工作正常。
【讨论】:
在使用 java 之前,您需要查看 RESULT SETS 子句。
MSSQL 具有此功能,可以以更实用的方式帮助您编写 java 代码。
这个例子将执行两个查询:
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
【讨论】:
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 retrieve data
}
rs.close();
//Check for next result set
results = stmt.getMoreResults();
}
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
【讨论】:
boolean 返回值的含义:true 表示下一个结果是ResultSet,而false 表示下一个结果是更新计数(或者,当更新计数为-1,即没有更多结果)。这尤其可能发生在 SQL Server(和 Sybase)上,结果集和更新计数可以从存储过程中发出。
UNION ALL 查询允许您组合 2 个或更多“选择”查询的结果集。它返回所有行(即使该行存在于多个“select”语句中)。
UNION ALL 查询中的每条 SQL 语句在具有相似数据类型的结果集中必须具有相同数量的字段.........
select * from projects
UNION ALL
select * from user
【讨论】:
答案:不可能。唯一的方法:将它们作为单独的查询运行。
【讨论】: