在网络上流行的“Oracle通用大数据量存储过程分页”代码在本地使用过程中发现有点不适合项目需求,所以抽时间修正了下,具体的不完善的地方表现为:

1、在第一页搜索的时候可以正常搜索出信息,但是如果跳转到地2页以后的分页上再搜索的时候就会出现找不到记录;

2、在比较大的的分页上搜索出多条记录时,如果搜索出来的记录的总页数比当前页码小,也不显示记录,因为搜索出的总记录的总页数比当前页数小;

下面修正版的分页存储过程修正了上面的错误,在此记录下,便于以后备用。

 

create or replace package body Pager is
procedure sp_Page
  (
    p_PageSize int,
    p_PageNo int,
    p_SqlSelect varchar2,
    p_SqlCount varchar2,
    p_OutRecordCount out int,
    p_OutCursor out refCursorType
  )
as
    v_sql varchar2(3000); 
    v_count int;           --总记录数
    v_totalpage int;     --总页数
    v_curpage int;       --当前页码
    v_heiRownum int;
    v_lowRownum int;
  begin
    execute immediate p_SqlCount into v_count;
    p_OutRecordCount := v_count;
    v_curpage := p_PageNo;
   
    v_totalpage := floor(v_count / p_PageSize);
    if mod(v_count,p_PageSize) != 0 then
       v_totalpage := v_totalpage + 1;
    end if;
   
    if v_totalpage <= 0 then
       v_totalpage := 1;
    end if;

    if v_totalpage < p_PageNo then
       v_curpage := v_totalpage;
    end if;
   
    v_heiRownum := v_curpage * p_PageSize;
    v_lowRownum := v_heiRownum - p_PageSize + 1;
   
    dbms_output.put_line(v_curpage);
                   
    v_sql := 'SELECT *
              FROM (
                     SELECT A.*, rownum rn
                     FROM ('|| p_SqlSelect ||') A
                     WHERE rownum <= '|| to_char(v_heiRownum) || '
                   ) B
              WHERE rn >= ' || to_char(v_lowRownum);
   
    OPEN p_OutCursor FOR v_sql;
  end sp_Page;
end Pager;