--包
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;