读书人

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

发布时间: 2011-12-26 23:09:58 作者: rapoo

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

读书人网 >Java Web开发

热点推荐