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));
    }
}