JDBC CallableStatement存储过程CURSOR结果集获取

时间:2016-03-08 13:47:33

标签: java oracle jdbc

我想将大量数据从oracle导出到csv文件。所以我使用简单的JDBC select语句来获取内存中的数据,然后将其写入文件,但数据非常大,我得到内存不足异常。所以我想用CallableStatement来调用存储过程,它将CURSOR返回ResultSet,如下所示: -

String getDBTableCursorSql = "{call getDBTableCursor(?,?)}";
callableStatement = dbConnection.prepareCall(getDBTableCursorSql);
callableStatement.setString(1, "test");
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);

// execute getDBTableCursorSqlstore procedure
callableStatement.executeUpdate();

// get cursor and cast it to ResultSet
rs = (ResultSet) callableStatement.getObject(2);

// loop it like normal 
while (rs.next()) {
    String userid = rs.getString("ID");
    String userName = rs.getString("NAME");
..
..
}   

Oracle Proc: -

 CREATE OR REPLACE PROCEDURE getDBTableCursor(
           p_username IN DBUSER.USERNAME%TYPE,
           c_dbuser OUT SYS_REFCURSOR)
    IS
    BEGIN

      OPEN c_dbuser FOR
      SELECT * FROM CUSTOMER WHERE USERNAME LIKE p_username || '%';

    END;

问题1 : - 以上ResultSet会在一次拍摄中获取所有数据吗?或者它将转到每个rs.next()的数据库,

问题2 : - 有没有其他方法可以处理使用块的大型数据导出到java文件,所以它不会出现内存不足的问题?

由于要求,我不能在这种情况下使用分页。

1 个答案:

答案 0 :(得分:1)

关于第一个问题:默认情况下,Oracle jdbc驱动程序一次提取10行。这可以通过标准jdbc验证或设置为其他值:

https://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28621