您的位置:程序门 -> java -> web 开发



___分页存储过程中游标打开超过最大数___的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


___分页存储过程中游标打开超过最大数___的问题[已结贴,结贴人:javaboy2006]
发表于:2007-05-07 22:33:51 楼主
每次调用下面的分页存储过程次数多了以后就会报:java.sql.sqlexception:   ora-01000:   超出打开游标的最大数

看了一下应该是这一句:open   p_outcursor   for   v_sql;  
游标打开了以后没有及时关闭,但是p_outcursor游标是作为存储过程的输出参数返回记录集的:p_outcursor   out   refcursortype   ,在存储过程内是不能关闭的,那应该在哪里关闭这个游标呢???

**********************************************

--创建分页package:

create   or   replace   package   curspkg   as

    type   refcursortype   is   ref   cursor;

    procedure   sp_page
    (
                p_pagesize               int, --每页记录数
                p_pageno                   int, --当前页码,从   1   开始
                p_sqlselect             varchar2, --查询语句,含排序部分
                p_sqlcount               varchar2, --获取记录总数的查询语句
                p_outrecordcount   out   int, --返回总记录数
                p_outcursor             out   refcursortype
      );

end;
/

--创建分页package   body:
create   or   replace   package   body   curspkg   is

    procedure   sp_page
    (
                p_pagesize               int, --每页记录数
                p_pageno                   int, --当前页码,从   1   开始
                p_sqlselect             varchar2, --查询语句,含排序部分
                p_sqlcount               varchar2, --获取记录总数的查询语句
                p_outrecordcount   out   int, --返回总记录数
                p_outcursor             out   refcursortype
      )
      is

        v_sql               varchar2(3000);
        v_count           int;
        v_heirownum   int;
        v_lowrownum   int;

    begin
        ----取记录总数
        EXECute   immediate   p_sqlcount   into   v_count;
        p_outrecordcount   :=   v_count;

        ----执行分页查询
        v_heirownum   :=   p_pageno   *   p_pagesize;
        v_lowrownum   :=   v_heirownum   -   p_pagesize   +   1;
   
        v_sql   :=   'select   *   from   (select   a.*,   rownum   rn  
        from   ( '   ¦ ¦   p_sqlselect   ¦ ¦   ')   a
        where   rownum   <=   '   ¦ ¦   to_char(v_heirownum)   ¦ ¦   ')   b
        where   rn   > =   '   ¦ ¦   to_char(v_lowrownum);

        open   p_outcursor   for   v_sql;

    end   sp_page;

end;
发表于:2007-05-08 11:48:291楼 得分:10
确实,短时间内重复打开游标会出现这种问题。
用ref   cursor将结果集传递到前台,使用完后,要及时调用resultset、callablestatement的close()方法。另一方面可以修改oracle参数,把这个值放大一些。
发表于:2007-05-08 15:58:022楼 得分:0
可我每次用完后都关闭了rs和cs,有时还是会出现这种情况。

****************代码如下*****************

public   object[]   getpagerecord(datasource   ds,   int   pagesize,   int   curpage,
string   sqlstr,   string   sqlcountstr)   {
callablestatement   cs;
connection   conn   =   null;

try   {
conn   =   ds.getconnection();
}   catch   (sqlexception   e1)   {
//   todo   自动生成   catch   块
e1.printstacktrace();
}

try   {
cs   =   conn.preparecall( "{call   curspkg.sp_page(?,?,?,?,?,?)} ");
cs.setint(1,   pagesize);   //   每页显示记录数
cs.setint(2,   curpage);   //   当前页号
cs.setstring(3,   sqlstr);   //   查询分页记录集的sql语句
cs.setstring(4,   sqlcountstr);   //   查询总记录数的sql语句
cs.registeroutparameter(5,   oracletypes.integer);   //   返回总记录数
cs.registeroutparameter(6,   oracletypes.cursor);   //   返回游标记录集
cs.EXECute();

//   返回总记录数
int   recordcount   =   ((oraclecallablestatement)   cs).getint(5);

//   所需总页数
int   totalpage   =   recordcount   /   pagesize;
if   (recordcount   %   pagesize   !=   0)   {
totalpage++;
}

resultset   rs   =   ((oraclecallablestatement)   cs).getcursor(6);
arraylist   recordlist   =   new   arraylist();
while   (rs.next())   {
userform   form   =   new   userform();
form.setuserid(rs.getint( "userid "));
form.setnickname(rs.getstring( "nickname "));
form.setusername(rs.getstring( "username "));
form.setsex(rs.getstring( "sex "));
form.setaddress(rs.getstring( "address "));
form.setbirthday(rs.getstring( "birthday "));
form.setemail(rs.getstring( "email "));
form.sethomepage(rs.getstring( "homepage "));
form.setqq(rs.getstring( "qq "));
form.settelephone(rs.getstring( "telephone "));
form.setuserpwd(rs.getstring( "userpwd "));
form.setpwdquestion(rs.getstring( "pwdquestion "));
form.setpwdresult(rs.getstring( "pwdresult "));
form.setface(rs.getstring( "face "));
recordlist.add(form);
}

rs.close();
cs.close();

object[]   pagereturnarray   =   {   recordlist,   totalpage   +   " ",
recordcount   +   " "   };
return   pagereturnarray;

}   catch   (sqlexception   e)   {
//   todo   自动生成   catch   块
e.printstacktrace();
return   null;

}   finally   {
try   {
conn.close();
}   catch   (sqlexception   e)   {
//   todo   自动生成   catch   块
e.printstacktrace();
}
}
}
发表于:2007-05-10 08:39:063楼 得分:10
这种存储过程不建议。
可以试一下tdc,从网上找找看,有这方面的资料。
但是,可能,也许,这种技术只支持ie的内核。
可以考虑一下看看。


快速检索

最新资讯
热门点击