【发布时间】:2018-06-18 04:54:36
【问题描述】:
从过程中获取游标结果集并对其进行迭代比查询结果集慢得多。我有一个返回游标的过程,但需要 5 秒才能获取下一个结果集。
String callProcedure = "{ call SCHEMANAME.TEMP_PACKAGE.GET_CURSOR_RESULTS(?,?,?,?) }";
cs = con.prepareCall(callProcedure);
cs.setString(1, "Variable1");
cs.setString(2,"Variable2");
cs.setString(3,"Variable3");
cs.registerOutParameter(4, OracleTypes.CURSOR);
ResultSet rs = (ResultSet) cs.getObject(4);
while (rs.next()){
}
我使用过日志,发现 rs.next() 需要 5-6 秒。 所以我改变了如下逻辑,
String callProcedure = "{ call SCHEMANAME.TEMP_PACKAGE.GET_CURSOR_RESULTS(?,?,?,?,?) }";
cs = con.prepareCall(callProcedure);
cs.setString(1, "Variable1");
cs.setString(2,"Variable2");
cs.setString(3,"Variable3");
cs.registerOutParameter(4,java.sql.Types.VARCHAR);
cs.registerOutParameter(5,java.sql.Types.INTEGER);
我从过程中获得了这些参数,并使用preparedStatement 来执行游标中使用的查询。
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()){
}
上述方法比使用 sys_refcursor 更快。请解释为什么使用 sys_refcursor 比普通查询花费更多时间。
PS:光标不会返回超过 20 行。
谢谢。
【问题讨论】:
-
从数据库中用
SYS_REFCURSOR执行程序的时间是几点?