JDBCマルチ結果セット処理
2540 ワード
一般的に、statementはexecuteを実行すると単一の結果セットのみが返され、複数の結果セットを一度に返すにはJDBC駆動のマルチ結果セット処理方式が必要になります.各データベース・ベンダーには異なる実装方法がありますが、共通してストレージ・プロシージャを使用して実装されています.
一、Oracleマルチ結果セットはref cursorに基づいて実現される
二、神通データベース(国産)多結果セットの処理方式はOracleと類似
三、Mysqlマルチ結果セットはストレージ中のクエリー文に基づく
四、SqlServerマルチ結果セットの処理方式はMysqlと類似しており、これ以上説明しない
一、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と類似しており、これ以上説明しない