2012年11月4日日曜日

PL/SQLで開いたカーソルをJDBC経由でJavaに返す方法

PL/SQLで開いたカーソルをJDBC経由で受け取り、Java側で処理する方法。

OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUser("hoge");
dataSource.setPassword("fuga");

try (Connection connection = dataSource.getConnection()) {
    // PL/SQLの定義。ref_curというref_cursorを開き、アウトパラメータ(? := ref_curの部分)に代入している。
    CallableStatement statement = connection.prepareCall(
            "declare "
                    + " ref_cur sys_refcursor;"
                    + " begin "
                    + " open ref_cur"
                    + " for ' select table_name from user_tables'; "
                    + " ? := ref_cur;"
                    + " end;"
    );

    // アウトパラメータの方をcursorと定義する
    statement.registerOutParameter(1, OracleTypes.CURSOR);
    statement.execute();

    // アウトパラメータをResultSetとして取得し、処理してあげる
    try (ResultSet resultSet = (ResultSet) statement.getObject(1)) {
        while (resultSet.next()) {
            System.out.println("resultSet.getString(\"table_name\") = " + resultSet.getString("table_name"));
        }
    }
}