我想将大量数据从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文件,所以它不会出现内存不足的问题?
由于要求,我不能在这种情况下使用分页。
答案 0 :(得分:1)
关于第一个问题:默认情况下,Oracle jdbc驱动程序一次提取10行。这可以通过标准jdbc验证或设置为其他值:
https://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28621