JDBCマルチ結果セット処理

2540 ワード

一般的に、statementはexecuteを実行すると単一の結果セットのみが返され、複数の結果セットを一度に返すにはJDBC駆動のマルチ結果セット処理方式が必要になります.各データベース・ベンダーには異なる実装方法がありますが、共通してストレージ・プロシージャを使用して実装されています.
 
一、Oracleマルチ結果セットはref cursorに基づいて実現される
 
Create table person (
Id  int, name varchar2(50)
)
Insert into person values(1, ‘test’);
 
 
Create or replace package pack as
Type cur is ref cursor;
End pack;
 
Create or replace procedure proc_test ( first 
out pack.cur ) as
Begin 
Open first for select * from person;
End proc_test;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import oracle.jdbc.driver.OracleTypes;
public class TestProCur {
public static void  main(){
  Connection con = null;
  ResultSet rs = null;
  CallableStatement cst = null;
  try{
        Class.forName("oracle.jdbc.driver.OracleDriver);
        conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "system");
        String sql = "{call  proc_test(?)}";
        cst = con.prepareCall(sql);
        cst.registerOutParameter(1, OracleTypes.CURSOR);
        cst.execute();
        rs = (ResultSet)cst.getObject(1);
        while(rs.next()){
              System.out.println(rs.getString(2));
        }
  }catch(Exception e){
    e.printStackTrace();
  }finally{
      try{
         if(rs !=null){
              rs.close();
         }
         if(cst != null){
              cst.close();
         }
         if(con != null){
              con.close();
         }
      }catch(Exception e){
         e.printStackTrace();
      }
 }
}
 
}

 
二、神通データベース(国産)多結果セットの処理方式はOracleと類似
 
三、Mysqlマルチ結果セットはストレージ中のクエリー文に基づく
 
CREATE PROCEDURE proc_test()  
BEGIN  
  select * from person
  select * from person;   
END;
 
String sql = "{call proc_test()}";  
ctmt = conn.prepareCall(sql);  
boolean hadResults = ctmt.execute();  
int i=0;  
ResultSet rs = null;
while (hadResults) {  
    System.out.println("result No:----"+(++i));  
    rs = ctmt.getResultSet();  
    while (rs != null && rs.next()) {  
        int id1 = rs.getInt(1);  
        String name1 = rs.getString(2);  
        System.out.println(id1 + ":" + name1);  
    }  
    hadResults = ctmt.getMoreResults(); //             
}  

 
四、SqlServerマルチ結果セットの処理方式はMysqlと類似しており、これ以上説明しない