java代码游标解决 java mysql游标( 二 )


while(rs2.next()){
for(k=0;kmyfiledname.length-i;k++){
String datapath1=rs2.getString(myfiledname[k]);
}
for(int m=k;mmyfiledname.length;m++){
rs5=Conn1.ExecuteQuery(sql2);
if(rs5.getRow()!=0){
rs5.first();
datapath3=rs5.getString("content");
}
Conn1.CloseStmt();
rs5.close();
rs5 = null;
}
}
}catch(SQLException eer){
eer.printStackTrace();
}
finally{
try
{
rs2.close();
if (rs5 != null) {
rs5.close();
Conn1.CloseStmt();
}
Conn.CloseStmt();
Conn.CloseConn();
Conn1.CloseConn();
}
catch(Exception e)
{}
}
java调用存储过程返回游标的结果集无法关闭游标的问题在过程里判断很简单呀
CREATE OR REPLACE PROCEDURE TESTPROC(CUR OUT SYS_REFCURSOR)
AS
default_c SYS_REFCURSOR;
BEGIN
OPEN CUR FOR SELECT * FROM AA;
if CUR%rowcount = 0 then
CUR:=default_c;
end if;
END;
定义一个默认空游标,没数据就返回它呗
java中怎样使用游标java中没有 , 但可以用Types.OTHER来代替
另外如果用的是Oracle数据库 , 则很方便的用OracleTypes.CURSOR来获取游标(需要class12.jar驱动程序)
在java中调用oracle过程,游标无效rs_cursor out 是返回java代码游标解决的游标java代码游标解决,但是一般都不这么用,而且游标都要关闭 , 
如果你想返回List 或结果集的话,不般都不用游标来返回记录集的,除非自定义oracle 或sqlserver的数据库 集合类型.
如果你是用java ,肯定用到 ibatis,hibernate 等数据中间件来查询返回结果,
例如ibatis的简单查询:
public ListOrder getOrdersNotInPackage(String tId) {
return this.getSqlMapClientTemplate().queryForList("getOrdersNotInPackage", tId);
}
调用xml 中配置的sql 来查询getOrdersNotInPackage 的sql  , 输入参数是tId。
超出打开游标的最大数,该如何处理?处理超出打开游标的最大数异常:\x0d\x0a在执行如下代码时 , 经常会出现ora-01000: maximum open cursors exceeded异常\x0d\x0afor(int i=0;i show parameter open_cursors;\x0d\x0aNAMETYPEVALUE\x0d\x0a------------------------------------ ----------- ---------------\x0d\x0aopen_cursorsinteger1000\x0d\x0a\x0d\x0a重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标 。应用程序不同 , 该值也不同 。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值),也不会增加系统开销 。\x0d\x0a2. 获取打开的游标数 。\x0d\x0a下面的查询按降序显示用户“SCOTT”为每个会话打开的游标数 。\x0d\x0aSQL select o.sid, osuser, machine, count(*) num_curs\x0d\x0a2from v$open_cursor o, v$session s\x0d\x0a3where user_name = 'SCOTT' and o.sid=s.sid\x0d\x0a4group by o.sid, osuser, machine\x0d\x0a5 order bynum_curs desc;\x0d\x0aSID OSUSERMACHINENUM_CURS\x0d\x0a-----------------------------------------------------\x0d\x0a217m11000\x0d\x0a96m210\x0d\x0a411m310\x0d\x0a50test9\x0d\x0a请注重,v$open_cursor 可以跟踪会话中 PARSED 和 NOT CLOSED 的动态游标(使用 dbms_sql.open_cursor() 打开的游标) 。它不会跟踪未经分析(但已打开)的动态游标 。在应用程序中使用动态游标并不常见 。本模式的前提是未使用动态游标 。\x0d\x0a3. 获取为游标执行的 SQL 。\x0d\x0a使用在以上查询结果中找到的 SID 运行下面的查询:\x0d\x0aSQL select q.sql_text\x0d\x0a2from v$open_cursor o, v$sql q\x0d\x0a3where q.hash_value=https://www.04ip.com/post/o.hash_value and o.sid = 217;/x0d/x0aSQL_TEXT/x0d/x0aselect * from empdemo where empid='212'\x0d\x0aselect * from empdemo where empid='321'\x0d\x0aselect * from empdemo where empid='947'\x0d\x0aselect * from empdemo where empid='527'\x0d\x0a...\x0d\x0a结果将显示正在连接上执行的查询 。它提供了一个入手点 , 让您可以反向跟踪到打开游标的来源 。\x0d\x0a\x0d\x0a这样的错误很轻易出现在java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor 。尤其是,假如你的createStatement和prepareStatement是在一个循环里面的话,就会非常轻易出现这个问题 。因为游标一直在不停的打开,而且没有关闭 。\x0d\x0a一般来说,我们在写Java代码的时候 , createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭 。最好是在执行了一次executeQuery、executeUpdate等之后,假如不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭 。\x0d\x0a对于出现ORA-01000错误这种情况 , 单纯的加大open_cursors并不是好办法,那只是治标不治本 。实际上,代码中的隐患并没有解除 。\x0d\x0a而且 , 绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常非凡的要求 。\x0d\x0a假如你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了 。\x0d\x0a但是假如你使用连接池,那么请注重,Connection关闭并不是物理关闭,只是归还连接池 , 所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库答应的最大值”的错误,导致程序无法正常访问数据库 。\x0d\x0a正确的代码,如下所示:\x0d\x0afor(int i=0;i

推荐阅读