Java 返回多个结果集的查询
我有一个Java 返回多个结果集的查询,java,sql,jdbc,Java,Sql,Jdbc,我有一个MSSQL数据库,正在运行以下查询: select * from projects; select * from user 上面的查询一次返回两个结果集,我无法分别启动这两个查询。如何在Java类中同时处理两个结果集?UNION ALL查询允许您组合两个或更多“select”查询的结果集。它返回所有行(即使该行存在于多个“select”语句中) UNION ALL查询中的每个SQL语句在具有类似数据类型的结果集中必须具有相同数量的字段 select * from projects UN
MSSQL
数据库,正在运行以下查询:
select * from projects; select * from user
上面的查询一次返回两个结果集,我无法分别启动这两个查询。如何在Java类中同时处理两个结果集?UNION ALL查询允许您组合两个或更多“select”查询的结果集。它返回所有行(即使该行存在于多个“select”语句中) UNION ALL查询中的每个SQL语句在具有类似数据类型的结果集中必须具有相同数量的字段
select * from projects
UNION ALL
select * from user
答案是:这是不可能的。唯一的方法是:将它们作为单独的查询运行。您可以使用Statement.execute(),getResultSet()
处理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();
}
重要信息:
和getmoresults()
返回execute()
,指示语句的结果只是一个数字,而不是false
ResultSet
- 您需要检查stmt.getUpdateCount()==-1以了解是否有更多结果
- 确保关闭结果集或使用
stmt.getmoresults(Statement.close\u CURRENT\u result)
是的,你可以。请参阅此MSDN文章
我已经对它进行了测试,效果很好。在使用java之前,您需要查看resultsets子句 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)
)
);
您也可以将存储过程用于结果集
更多信息:大家好,我想问的基本问题是:“有没有办法在一个查询中同时处理两个结果集?”??大家好,基本上我想要的是:“有没有办法在一个查询中同时处理两个结果集?”??是或否。如果是,那么如何在java代码中。JDBC支持多个结果集这误解了
布尔值
返回值的含义:true
表示下一个结果是ResultSet
,而false
表示下一个结果是更新计数(或者,当更新计数为-1
时,表示没有更多结果)。特别是在SQL Server(和Sybase)上,结果集和更新计数可以从存储过程中发出。这会误解布尔值
返回值的含义:true
表示下一个结果是ResultSet
,而false
表示下一个结果是更新计数(或者,当更新计数为-1
时,没有更多的结果)。这种情况可能会发生,特别是在SQL Server(和Sybase)上,结果集和更新计数可以从存储过程发出。在这个答案中,我不知道stmt来自何处。我意识到stmt是一个准备好的语句,但不清楚。
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();
}
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();
}
}
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)
)
);