1. 程式人生 > >Java獲取儲存過程返回的多個結果集

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

  1. BEGIN
  2. select * from teacher;  
  3. SELECT * FROM student;  
  4. 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即可