Oralceのストアド経由でResultSetをうける方法
OUTパラメータとして登録してCallableStatement#getValue()すれば取得できます。
本当はCallableStatement#getResultSet()で返ってきてほしいのですけど。。。
なんか、BEAのドライバ(BEA WebLogic Type 4 JDBC Oracle ドライバ)を使うと、CallableStatement#getResultSet()で返してくれるようですね。
http://edocs.beasys.co.jp/e-docs/wls/docs90/jdbc_drivers/oracle.html#1067241
以下、Oralce 10g で動かしてみました。SYS_REFCURSORが使えるのは9i以降みたい。9iより前ではわざわざパッケージにカーソルを定義しないといけなかったのが、SYS_REFCURSORを使うことで必要なくなるぽいです。
PL/SQLストアド・プロシージャを使う方法
PL/SQLストアド・プロシージャ
CREATE OR REPLACE PROCEDURE FOOPROCEDURE (cur OUT SYS_REFCURSOR) AS BEGIN OPEN cur FOR SELECT * FROM DEPT; END FOOPROCEDURE;
Java
public void testProcedure() throws Exception { CallableStatement cs = getConnection().prepareCall( "{call fooProcedure(?)}"); cs.registerOutParameter(1, OracleTypes.CURSOR); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(1); while (rs.next()) { System.out.println(rs.getObject(1)); } }
PL/SQLファンクションを使う方法
PL/SQLファンクション
CREATE OR REPLACE FUNCTION HOGEFUNCTION RETURN SYS_REFCURSOR AS cur SYS_REFCURSOR; BEGIN OPEN cur FOR SELECT * FROM DEPT; RETURN cur; END HOGEFUNCTION;
Java
public void testFunction() throws Exception { CallableStatement cs = getConnection().prepareCall( "{? = call hogeFunction()}"); cs.registerOutParameter(1, OracleTypes.CURSOR); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(1); while (rs.next()) { System.out.println(rs.getObject(1)); } }