Oracle 分页存储过程 几十万条记录

好长时间没写东东了,今天写了一个oracle的分页存储过程,贴出来与大家分享。

由于。net框架中的gridview等控件的分页功能太弱,所以大部分程序员都会自己写分页功能,而调用分页存储过程是必须的。

前台aspx页面不管是用下载的dll还是用自己写的用户控件,都能实现自己的功能,然而分页的存储过程就需要好好的考虑了,下边是我写的oracle的存储过程(参考sql server数据库的存储过程写成的),效率还可以,并附上调试的过程(调试环境:win2003、oracle 9i,调试工具:pl/sql):

--I/O消耗1071

select id,orgid,dj_date,khid,khcode,khname,feeid from fee_ysfy;
--493408
select count(id) from fee_ysfy;
--22.391执行完成(内外都有order by)
select id, orgid, dj_date, khid, khcode, khname, feeid
  from (select rownum rn, t.id, orgid, dj_date, khid, khcode, khname, feeid
          from fee_ysfy t
         where 1 = 1
         order by id desc)
 where rn <= 45
   and rn >= 30
 order by id desc
 --22.437(只有子查询有order by)
 select id, orgid, dj_date, khid, khcode, khname, feeid
  from (select rownum rn, t.id, orgid, dj_date, khid, khcode, khname, feeid
          from fee_ysfy t
         where 1 = 1
         order by id desc)
 where rn <= 45
   and rn >= 30
--优化去掉order by0.891(去掉所有的order by)
select id, orgid, dj_date, khid, khcode, khname, feeid
  from (select rownum rn, t.id, orgid, dj_date, khid, khcode, khname, feeid
          from fee_ysfy t
         where 1 = 1
         )
 where rn <= 45
   and rn >= 30
--将order by放到外边0.828秒(把order by放到外边)
select id, orgid, dj_date, khid, khcode, khname, feeid
  from (select rownum rn, t.id, orgid, dj_date, khid, khcode, khname, feeid
          from fee_ysfy t
         where 1 = 1
         )
 where rn <= 45
   and rn >= 30 order by id desc
--优化后的存储过程
create or replace procedure pagecount
(
tblName      varchar2,       -- 表名
strselect      varchar2,       --查询的字段名
fldName      varchar2 default '*',       -- 主键字段名
PageSize     number default 10,           -- 页尺寸
PageIndex    number default 1,            -- 页码
v_RowCount   out integer ,            -- 返回记录总数
OrderType    number default 0,            -- 设置排序类型, 非 0 值则降序
strWhere     varchar2 default ' 1=1',  -- 查询条件 (注意: 不要加 where)
OutSql out varchar2
)
is
strSQL   varchar2(4000);       -- 主语句
strOrder varchar2(4000);       -- 排序类型
v_sql varchar2(4000);--临时变量
begin
     if OrderType != 0 then
      begin
          strOrder := ' order by ' ||fldName ||' desc';
      end;
      else
      begin
          strOrder := ' order by ' ||fldName ||' asc';
      end;
      end if;
      if PageIndex = 1 then
      begin
           strSQL := 'select '||strselect||' from (select rownum rn,t.'||strselect||' from '||tblName||' t where '||strWhere|| ') where rn <= '||PageIndex*PageSize||' and rn >= 1 '||strOrder;
      end;
      else
      begin
           strSQL := 'select '||strselect||' from (select rownum rn,t.'||strselect||' from '||tblName||' t where '||strWhere|| ') where rn <= '||PageIndex*PageSize||' and rn >= '||(PageIndex - 1)*PageSize||' '||strOrder;
      end;
      end if;
      OutSql := strSQL;
      v_sql := 'select count('||fldName||') from (' || tblName || ')  where '||strWhere;
      execute immediate v_sql into v_RowCount;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值