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

解决方案 »

  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;