急需一个oracle通用分页存储过程

wty814022051 2010-07-29 07:41:12
急需一个oracle通用分页存储过程
...全文
37 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

--包
create or replace package package_page is
type cur_record is ref cursor;
procedure proc_page(
v_currenTable varchar2,--表名
v_currenPage int,--当前页
v_maxNumber int,--每页行数
v_where varchar2,--条件
v_field varchar2,--字段
v_order varchar2,--排序
v_totalRecords out number,--结果集行数
v_totalPages out number,--总页数
v_records out package_page.cur_record --返回的结果集
);
end package_page;


--过程包体
create or replace package body package_page is
procedure proc_page(
v_currenTable varchar2,--表名
v_currenPage int,--当前页
v_maxNumber int,--每页行数
v_where varchar2,--条件
v_field varchar2,--字段
v_order varchar2,--排序
v_totalRecords out number,--结果集行数
v_totalPages out number,--总页数
v_records out package_page.cur_record --返回的结果集
)
is
v_cur_end number(4);--游标所在的结束位置
v_cur_begin number(4);--游标所在的开始位置
v_sql varchar2(1000);--要执行的sql语句
begin
if v_where is null then
v_sql:='select to_number(count(*)) from '||v_currenTable;
else
v_sql:='select to_number(count(*)) from '||v_currenTable||' where '||v_where;
end if;

--获取总记录数
execute immediate v_sql into v_totalRecords;
--获取总页数
if mod(v_totalRecords,v_maxNumber) = 0 then
v_totalPages := v_totalRecords/v_maxNumber;
else
v_totalPages := ceil(v_totalRecords/v_maxNumber);
end if;

--获取游标所在的开始位置与结束位置
if v_currenPage=0 then
v_cur_begin:=0;
v_cur_end:=v_maxNumber+1;
elsif v_currenPage>=v_totalPages then
v_cur_begin:=(v_totalPages-1)*v_maxNumber;
v_cur_end:=v_totalPages*v_maxNumber;
else
v_cur_begin:=(v_currenPage-1)*v_maxNumber;
v_cur_end:=v_currenPage*v_maxNumber+1;
end if;

if v_where is null then
if v_order is null then
v_sql:='select * from (select rownum num,'||v_field||' from '||v_currenTable||' where rownum<'||v_cur_end||') where num>'||v_cur_begin;
else
v_sql:='select * from (select rownum num,'||v_field||' from '||v_currenTable||' where rownum<'||v_cur_end||' '||v_order||') where num>'||v_cur_begin;
end if;
else
if v_order is null then
v_sql:='select * from (select rownum num,'||v_field||' from '||v_currenTable||' where rownum<'||v_cur_end||' and '||v_where||') where num>'||v_cur_begin;
else
v_sql:='select * from (select rownum num,'||v_field||' from '||v_currenTable||' where rownum<'||v_cur_end||' and '||v_where||' '||v_order||') where num>'||v_cur_begin;
end if;
end if;

DBMS_OUTPUT.put_line(v_sql);
open v_records for v_sql;
end proc_page;
end package_page;

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧