SERVELT里面CALL了一个ORACLE的PROCEDURE,返回一个游标的结果集,并把这个游标结果集赋予RESULT对象RS,当我在JSP页面里WHILE(RESULT.NEXT)的时候系统总是说ERROR:500 结果集已关闭 :next。不知道这个游标怎么会自动关闭的,我在PROCEDURE和SERVELT里面没有任何游标关闭的语句啊。附关键代码:PROCEURE
/********************************************************************
用途:查询特殊交易维护控制表记录
********************************************************************/
PROCEDURE proc_etrade_maintain_select (
p_i_areano IN VARCHAR2,
p_i_tradecode IN VARCHAR2,
p_o_retcode OUT VARCHAR2,
p_o_retmsg OUT VARCHAR2,
p_o_retcur OUT outcur
)
IS
v_l_sql VARCHAR2 (1000);
n_l_first NUMBER (1);
BEGIN
p_o_retcode := 00;
p_o_retmsg := 处理成功;
n_l_first := 1;
v_l_sql := select * from P_FW_etrade_maintain ;
OPEN p_o_retcur
FOR v_l_sql;
EXCEPTION
WHEN OTHERS
THEN
p_o_retcode := SQLCODE;
p_o_retmsg := 查询特殊交易维护控制表记录失败,原因: || SQLERRM;
END proc_etrade_maintain_select;
servelt:
public ResultSet findByKey(String areano,String tradecode, String[] opMessage) {
int i_areano=1;
int i_tradecode =2;
int o_retcode=3;
int o_retmsg=4;
int o_retcur=5;
Connection conn = null;
CallableStatement cs = null;
ResultSet rs = null;
opMessage[1] = "queryETradeMaintain";
//数据操作
try {
conn = ds.getConnection();
cs = conn.prepareCall("{call pack_p_fw_etrade_maintain.proc_etrade_maintain_select(?,?,?,?,?)}");
cs.setString(i_areano, areano);
cs.setString(i_tradecode, tradecode);
cs.registerOutParameter(o_retcode, Types.VARCHAR);
cs.registerOutParameter(o_retmsg, Types.VARCHAR);
cs.registerOutParameter(o_retcur, OracleTypes.CURSOR);
cs.execute();
opMessage[0] = "特殊交易维护控制 : 返回代码:" + cs.getString(o_retcode)
+";返回信息:" + cs.getString(o_retmsg);
rs = (ResultSet) cs.getObject(o_retcur);
}
catch (SQLException se) {
System.err.println("特殊交易维护控制 : 获取参数时出错-->" + se.getMessage());
return null;
}
//操作结束后的清理工作
finally {
try {
if (cs != null){
cs.close();
}
if (conn != null) {
conn.close();
}
}
//清理工作出现异常
catch (SQLException se) {
System.err.println("特殊交易维护控制 : 获取参数后,关闭时出错-->" + se.getMessage());
return null;
}
}
return rs;
}
上面的SERVELT里RETURN RS后,这个RS是关闭的,请问要怎么打开,为什么会关闭。谢谢!
你的cs与conn都关闭了,return之后,resultset肯定关闭了
实际上RS只是一个取结果集的上下文罢了
CONNECT只是数据库连接的上下文罢了
ResultSet , Statement , 关闭了之后相关联产生的都会关闭。
ResultSet 不可能在一个 Statement 关闭之后还处于打开状态。
你只有在关闭之前取出所有数据,因为 Statement 关闭了就意味着 数据库不理会你了。
ResultSet依赖于Connection,弄明白这一层关系你的问题就好解决了。
ResultSet并不会一次性地把查询得到的记录全部从DB取回到本地内存,而是每次只取一批,要用到下一批数据的时候再次通过Connection到DB获取。Connection关闭之后,ResultSet的存在是没有意义的。