这几天,公司重构一套erp,用到很多存储过程,但我在用jdbc调用存储过程的时候发现无法接收多个结果集(存储过程select返回的Result),而且国内很难找到解决方案,今天下午花了一下午,最后终于实现了。
Connection conn = JdbcUtil.getConnection();
CallableStatement stmt = null;
//通过sqlserver exec方法调用存储过程
stmt = conn.prepareCall("EXEC dbo.sp_Query_GetVehiceTimeOuts '01'");
//jdbc通用语法为
// stmt = conn.prepareCall("{call dbo.sp_Query_GetVehiceTimeOuts(?)}");
// stmt.setString(1, "01");
boolean hashResult = stmt.execute();
while (true) {
//判断本次循环是否为数据集
if (hashResult) {
System.out.println("为数据集");
ResultSet rs = stmt.getResultSet();
// Do something with resultset ...
while (rs.next()){
System.out.println(rs.getString(1));
}
} else {
System.out.println("本次不为数据集");
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) {
/*
当updateCount为-1时,
代表存储过程返回的最后一条数据集
跳出循环
*/
System.out.println("最后一次");
break;
}
// Do something with update count ...
}
/*
每次判断下一个是否为了数据集
stmt.getMoreResults() 为 true表示下一次循环为数据集,false为空
*/
hashResult = stmt.getMoreResults();
System.out.println(hashResult);
}
大体的逻辑就是
首先是死循环,
然后判断提交sql返回的收个数据是否为结果集,
如果是就进入结果集处理,如果不是,通过getUpdateCount方法获取下一个结果,并判断getUpdateCount结果是否为-1,-1代表最后一条结果集,当结果为-1时跳出循环,否则继续循环该段代码