java 调用sql server存储过程返回多个结果集问题

wgsasd311 2018-12-26 03:47:35
java 调用SQL SERVER存储过程,该存储过程里面有增删改语句,也有返回记录集语句,我怎样获取本次返回的结果集数目,又怎样显示每个结果集里面数据。
...全文
443 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2018-12-27
  • 打赏
  • 举报
回复
引用 4 楼 wgsasd311 的回复:
再次申明下,该存储过程中既有增删改语句(insert,update,delete)也有select * from TB语句 ,互相参杂在一块了,我要知道返回了几个结果集(select * from tb)、




从官方帮助文档看,
A CallableStatement can return one ResultSet object or multiple ResultSet objects. Multiple ResultSet objects are handled using operations inherited from Statement.

可以通过Statement里面的getMoreResults() 来获取下一个结果集。

boolean getMoreResults()
throws SQLException
Moves to this Statement object's next result, returns true if it is a ResultSet object, and implicitly closes any current ResultSet object(s) obtained with the method getResultSet.
There are no more results when the following is true:

// stmt is a Statement object
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
wgsasd311 2018-12-27
  • 打赏
  • 举报
回复
这是我下面写的方法,根据楼上仁兄的建议: import java.sql.*; public class HelloWorld { public static void main(String[] args) throws ClassNotFoundException { Connection conn; CallableStatement stmt; ResultSet rs; String url = "jdbc:sqlserver://IP:1433;DatabaseName=dbName"; String sql = "{call pptest (?,?)}"; try { // 连接数据库 conn = DriverManager.getConnection(url, "sa", "sasasa"); // 建立Statement对象 stmt = conn.prepareCall(sql); //stmt.registerOutParameter(1, java.sql.Types.INTEGER); stmt.setInt("num",11); stmt.setString("BH","2190048"); // 执行数据库查询语句 boolean hashResult=stmt.execute(); int resultCount=0; while (true) { resultCount++; System.out.print("第"+resultCount+"条语句执行["); //判断本次循环是否为数据集 if (hashResult) { System.out.print("本次返回结果集]:"); rs = stmt.getResultSet(); while (rs.next()) { System.out.print(rs.getString(1)+"\t"); } } else { int updateCount = stmt.getUpdateCount(); System.out.print("本次增删改影响行数]:"+updateCount); if (updateCount == -1) { System.out.print("最后一次"); break; } // Do something with update count ... } hashResult = stmt.getMoreResults(); System.out.println("\t"+hashResult); } if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); System.out.println("数据库连接失败"); } }
wgsasd311 2018-12-26
  • 打赏
  • 举报
回复
引用 1 楼 咸哼酒家 的回复:
参考这个额 https://www.cnblogs.com/liunanjava/p/4261242.html 其实和查询一样,还是一段SQL,返回集合,; 不同的是这个SQL中有增删改语句,但对于后台而言都是execute() 一个这么玩String sql="{call getEmpCount(?)}"; 一个这么玩String sql="select * from Emp"; 解析结果集和记录数 比如 rs=(ResultSet) proc.getObject(1); while(rs.next()) 循环遍历拿到详细数据和对应的记录数
======>解决不了我的问题哦。
wgsasd311 2018-12-26
  • 打赏
  • 举报
回复
再次申明下,该存储过程中既有增删改语句(insert,update,delete)也有select * from TB语句 ,互相参杂在一块了,我要知道返回了几个结果集(select * from tb)、
wgsasd311 2018-12-26
  • 打赏
  • 举报
回复
引用 2 楼 sunny906 的回复:

  String sql="{CALL test_proc()}";
  CallableStatement cstm=con.prepareCall(sql);
  value=cstm.execute();
  while(value){
    rs=cstm.getResultSet(); //取得第一个结果集
    if(rs.next){
      System.out.println(rs.getInt(1));//打印出结果集的第一个字段
    }
    value=cstm.getMoreResultSet();//继续去取结果集
  }
============》假 如存储过程中第一条语句是增删改,你这写法就不对了。
sunny906 2018-12-26
  • 打赏
  • 举报
回复

  String sql="{CALL test_proc()}";
  CallableStatement cstm=con.prepareCall(sql);
  value=cstm.execute();
  while(value){
    rs=cstm.getResultSet(); //取得第一个结果集
    if(rs.next){
      System.out.println(rs.getInt(1));//打印出结果集的第一个字段
    }
    value=cstm.getMoreResultSet();//继续去取结果集
  }
咸哼酒家 2018-12-26
  • 打赏
  • 举报
回复
参考这个额 https://www.cnblogs.com/liunanjava/p/4261242.html
其实和查询一样,还是一段SQL,返回集合,;
不同的是这个SQL中有增删改语句,但对于后台而言都是execute()
一个这么玩String sql="{call getEmpCount(?)}"; 一个这么玩String sql="select * from Emp";
解析结果集和记录数 比如 rs=(ResultSet) proc.getObject(1);
while(rs.next()) 循环遍历拿到详细数据和对应的记录数

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧