基于Oracle存储过程的快速分页

      我们在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值