jdbc调用存储过程获取多个结果集

这几天,公司重构一套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时跳出循环,否则继续循环该段代码



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储过程(存储函数)是一段预先编译好的SQL代码,可被多次调用。它通常用于执行一些复杂的操作,如数据验证、数据转换、数据计算和数据访问等,可以提高数据库的性能和安全性。 触发器是一种数据库对象,它是与特定表相关联的一个程序,可以在特定的数据库事件(如插入、更新或删除)发生时自动执行。触发器通常用于维护数据一致性和完整性,可以执行一些验证、转换、计算和访问操作等。 在Java程序中,可以通过JDBC调用存储过程(存储函数),一般步骤如下: 1. 加载数据库驱动程序:使用`Class.forName()`方法加载数据库驱动程序。 2. 建立数据库连接:使用`DriverManager.getConnection()`方法建立数据库连接,需要提供数据库的URL、用户名和密码。 3. 创建CallableStatement对象:使用`Connection.prepareCall()`方法创建CallableStatement对象,用于调用存储过程(存储函数)。 4. 设置参数:使用`CallableStatement.setXXX()`方法设置存储过程(存储函数)的输入参数和输出参数。 5. 执行存储过程(存储函数):使用CallableStatement对象的`execute()`或`executeQuery()`方法执行存储过程(存储函数)。 6. 处理输出结果:如果存储过程(存储函数)有输出参数,则需要使用CallableStatement对象的`getXXX()`方法获取输出参数的值。 7. 关闭数据库连接:使用`Connection.close()`方法关闭数据库连接。 需要注意的是,在调用存储过程(存储函数)时,需要使用存储过程(存储函数)的完整名称(包括数据库名称、模式名称和对象名称)。例如,如果存储过程的名称为`SP_INSERT_USER`,则需要使用完整名称来调用它,如`{call database.schema.SP_INSERT_USER(?, ?, ?)}`。同时,需要根据存储过程(存储函数)的输入参数和输出参数的类型来设置对应的`setXXX()`和`getXXX()`方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值