在做实验的时候 遇到了一个问题,就是需要把在存储过程中查询的结果集用jdbc获取
刚开始查资料的时候有一种方法就是,在存储过程中定义一个cursor变量,然后通过这个变量来获取select出的表
然后就按照资料编写代码,然而这种方法适合Oracle,但我用的是sqlserver数据库,而jdbc中并没有支持sqlserver中的cursor,所以不能使用cursor这种方法
接着再继续找资料,最后让我找到了一种方法
先给出存储过程的代码
USE [testdb]
GO
/****** Object: StoredProcedure [dbo].[Disp_Student] Script Date: 2017/2/27 17:57:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[Disp_Student]
(@SNO varchar(7),@SUM_CREDIT int output,@AVG_GRADE smallint output)
as
select * from student s inner join sc on sc.sno=s.sno
inner join course c on sc.cno=c.cno
where s.sno=@SNO
select @SUM_CREDIT=sumcredit
from credits where sno=@SNO
select @AVG_GRADE=avg(SC.GRADE)
from student s inner join SC on sc.sno=s.sno where s.sno=@SNO and SC.grade>3
group by s.sno
然后是Java的程序代码
package com.jdbctest;
import java.sql.*;
import static java.sql.Types.*;
public class dbtest {
public static void main(String[] args){
String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=testdb";
String userId="sa";
String userPwd="123456";
Connection dbConn;
CallableStatement stmt;
ResultSet rs;
try {
Class.forName(driverName);
dbConn=DriverManager.getConnection(dbURL,userId,userPwd);
stmt= dbConn.prepareCall("{call Disp_Student(?,?,?)}");
stmt.setString(1,"0209101");
stmt.registerOutParameter(2, INTEGER);
stmt.registerOutParameter(3, INTEGER);
stmt.execute();
rs=stmt.getResultSet();
int columnCount=rs.getMetaData().getColumnCount();
while(rs.next()){
StringBuffer sb=new StringBuffer();
for(int i=0;i<columnCount;i++){
sb.append(rs.getString(i+1)+"|");
}
System.out.println(sb);
}
int sum_credit=stmt.getInt(2);
int sum_grade=stmt.getInt(3);
System.out.println(sum_credit+"|"+sum_grade);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
因为要调用存储过程,所以使用CallableStatement来传递sql语句
然后就是通过prepareCall来传递参数
接着是运行,因为stmt.execute()的返回类型是boolean所以是不能获取结果集的
但是能通过执行完execute方法后执行getResultSet()方法来获取结果集
需要一个注意事项就是
获取结果集一定要在获取存储过程参数之后
因为再获取存储过程参数之后再获取结果集就会出现空指针错误
参考资料http://bbs.csdn.net/topics/60250885