您的位置:首页 > 数据库 > Oracle

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

2010-04-10 10:41 453 查看
好长时间没写东东了,今天写了一个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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: