首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

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

2011-12-26 
___分页存储过程中游标打开超过最大数___的问题每次调用下面的分页存储过程次数多了以后就会报:java.sql.S

___分页存储过程中游标打开超过最大数___的问题
每次调用下面的分页存储过程次数多了以后就会报: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;


[解决办法]
确实,短时间内重复打开游标会出现这种问题。
用ref cursor将结果集传递到前台,使用完后,要及时调用ResultSet、CallableStatement的close()方法。另一方面可以修改ORACLE参数,把这个值放大一些。
[解决办法]
这种存储过程不建议。
可以试一下tdc,从网上找找看,有这方面的资料。
但是,可能,也许,这种技术只支持ie的内核。
可以考虑一下看看。

热点排行