Java獲取儲存過程返回的多個結果集
第一步:寫你的儲存過程
delimiter //
create procedure test_proc ()
begin
select * from test_table1 where id=1;
select * from test_table2 where id=2;
select * from test_table3 where id=3;
end;
//
delimiter ;
call test_proc()這樣就可以返回三個結果集,每個結果集對應一個select。
那麼在JAVA程式裡面如何來取得這三個結果集呢?!
這樣做:
boolean bl = false;
ResultSet = null;
Connection con = new Connection();
con="得到一個有效的連線"
String strSql="{CALL test_proc()}";
CallableStatement cstm=con.prepareCall(strSql);
bl=cstm.execute();----若儲存過程被正常執行,並至少有一個結果集返回,則bl=true;否則就會是bl=false;
while(bl){
rs=cstm.getResultSet();---取得第一個結果集
if(rs.next){
System.out.println(rs.getInt(1));----打印出結果集的第一個欄位
}
bl=cstm.getMoreResultSet();----繼續去取結果集,若還還能取到結果集,則bl=true了。然後回去迴圈。
}
這樣,就可以迴圈把結果集處理了,注意儲存過程中每個SELECT都返回一個結果集,查詢中的處理方式就是如上。
這是最科學的處理方式。
轉http://www.xue5.com/Developer/Java/677461.html
MySQL資料庫中有兩個表,一個student,一個teacher
其中student表結構如下
teacher表如下
有儲存過程checkAll
- BEGIN
- select * from teacher;
- SELECT * FROM student;
- END
Java程式碼如下
1 public static Map<String,Object>getAll(){ 2 Connection conn=null; 3 CallableStatement cs=null; 4 ResultSet rs=null; 5 Map<String,Object> map=new HashMap<String, Object>(); 6 Map<String,String> temp=null; 7 List<Map<String,String>> list=null; 8 try { 9 conn=DBCon.getInstance(); 10 cs=conn.prepareCall("{call checkAll()}"); 11 cs.execute(); 12 rs=cs.getResultSet(); 13 if(rs!=null){ 14 list=new ArrayList<Map<String,String>>(); 15 while(rs.next()){ 16 temp=new HashMap<String, String>(); 17 temp.put("id", rs.getInt("id")+""); 18 temp.put("birthday", rs.getDate("birthday")+""); 19 temp.put("name", rs.getString("name")+""); 20 temp.put("title", rs.getString("title")+""); 21 list.add(temp); 22 } 23 map.put("teacher", list); 24 if(cs.getMoreResults()){ 25 rs=cs.getResultSet(); 26 list=new ArrayList<Map<String,String>>(); 27 while(rs.next()){ 28 temp=new HashMap<String, String>(); 29 temp.put("id", rs.getInt("id")+""); 30 temp.put("name", rs.getString("name")); 31 temp.put("age", rs.getInt("age")+""); 32 list.add(temp); 33 } 34 map.put("student", list); 35 } 36 } 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } 40 finally{ 41 DbUtils.closeQuietly(conn, cs, rs); 42 } 43 return map; 44 }
若是資料庫是SqlServer,儲存過程涉及到表的更新(增、刪、改)的話會出錯,可以在儲存過程裡面加上一句:set nocount on即可