我们在web开发中经常会遇到对数据库中的记录进行分页的问题。如果一次性将所有的结果集从数据库中取出,再进行分页处理的话常常出现数据集过大导致服务器响应缓慢,进而可能会导致服务器瘫痪。无论从效率还是性能上讲都有很大的缺陷,下面介绍一种通过存储过程执行分页处理,实现针对页码来取得数据集:
CREATE
OR
REPLACE
PROCEDURE usp_GetRecordFromPage(tblName
IN
VARCHAR2
DEFAULT
NULL,
-- 表名
selectFieldName IN VARCHAR2 DEFAULT NULL, -- 要显示的字段名(不要加select)
strWhere IN VARCHAR2 DEFAULT NULL, -- 查询条件(注意: 不要加 where)
orderFieldName IN VARCHAR2 DEFAULT NULL, -- 排序索引字段名
pageSize IN Integer DEFAULT NULL, -- 页大小
pageIndex IN Integer DEFAULT 1, -- 页码
OrderType IN Integer Default 0, -- 设置排序类型, 非 0 值则降序
irowCount OUT Integer, -- 返回记录总数
resultList OUT SYS_REFCURSOR) As
strSQL VARCHAR2(4000); -- 主语句
strTmp VARCHAR2(4000); -- 临时变量
strOrder VARCHAR2(400); -- 排序类型
strRowCount VARCHAR2(4000); -- 用于查询记录总数的语句
intTmpCount Number; --临时变量
startNum Number; --分页开始序号
endNum Number; --分页结束序号
selectSql Varchar(4000);
Begin
startNum := ((pageIndex - 1) * PageSize) + 1;
endNum := pageIndex * PageSize;
IF OrderType != 0 THEN
BEGIN
strTmp := '<(select min';
strOrder := ' order by ' || orderFieldName || ' desc';
END;
ELSE
BEGIN
strTmp := '>(select max';
strOrder := ' order by ' || orderFieldName || ' asc';
END;
END IF;
strSQL := 'select ' || ' ' || SelectFieldName || ' FROM ' || tblName ||
' where ' || strWhere || ' ' || strOrder;
selectSql := 'SELECT * FROM ( SELECT tmp.* , ROWNUM as rownum_ from ( ' ||
strSQL || ') tmp ) where rownum_ >= ' || startNum ||
' and rownum_ <=' || endNum;
OPEN resultList For selectSql;
strRowCount := 'select count(*) from (' || strSQL || ') ';
Begin
Execute Immediate strRowCount
Into irowCount;
End;
selectFieldName IN VARCHAR2 DEFAULT NULL, -- 要显示的字段名(不要加select)
strWhere IN VARCHAR2 DEFAULT NULL, -- 查询条件(注意: 不要加 where)
orderFieldName IN VARCHAR2 DEFAULT NULL, -- 排序索引字段名
pageSize IN Integer DEFAULT NULL, -- 页大小
pageIndex IN Integer DEFAULT 1, -- 页码
OrderType IN Integer Default 0, -- 设置排序类型, 非 0 值则降序
irowCount OUT Integer, -- 返回记录总数
resultList OUT SYS_REFCURSOR) As
strSQL VARCHAR2(4000); -- 主语句
strTmp VARCHAR2(4000); -- 临时变量
strOrder VARCHAR2(400); -- 排序类型
strRowCount VARCHAR2(4000); -- 用于查询记录总数的语句
intTmpCount Number; --临时变量
startNum Number; --分页开始序号
endNum Number; --分页结束序号
selectSql Varchar(4000);
Begin
startNum := ((pageIndex - 1) * PageSize) + 1;
endNum := pageIndex * PageSize;
IF OrderType != 0 THEN
BEGIN
strTmp := '<(select min';
strOrder := ' order by ' || orderFieldName || ' desc';
END;
ELSE
BEGIN
strTmp := '>(select max';
strOrder := ' order by ' || orderFieldName || ' asc';
END;
END IF;
strSQL := 'select ' || ' ' || SelectFieldName || ' FROM ' || tblName ||
' where ' || strWhere || ' ' || strOrder;
selectSql := 'SELECT * FROM ( SELECT tmp.* , ROWNUM as rownum_ from ( ' ||
strSQL || ') tmp ) where rownum_ >= ' || startNum ||
' and rownum_ <=' || endNum;
OPEN resultList For selectSql;
strRowCount := 'select count(*) from (' || strSQL || ') ';
Begin
Execute Immediate strRowCount
Into irowCount;
End;