procedure proc_Page(p_PageSize int,          --每页记录数
                  p_PageNo int,            --当前页码,从 1 开始
                  p_SqlSelect varchar2,    --查询语句,含排序部分
                  p_SqlCount varchar2,     --获取记录总数的查询语句
                  p_OutRecordCount out int,--返回总记录数
                  p_OutCursor out t_refcursor)
as
    v_sql varchar2(4000);
    v_count int;
    v_heiRownum int;
    v_lowRownum int;
begin
  ----取记录总数
  execute immediate p_SqlCount into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;  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) ;
            --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn 
  OPEN p_OutCursor FOR  v_sql;
exception
    when others then
        raise;
end proc_page;
-------------------------------------
以上是采用网上的过程分页,但不知道为何每次分页时,会把上一页的一到两条数据带到下一页(查询条件没变化),也就是说有一到两条符合条件的数据无法显示出来!
如下:
第一页
a
b
c
d
e
第二页
e
f
g
h
i
不知道何故!请教大家,使用此过程时是否遇到!

解决方案 »

  1.   

    不会!
    我用最后生成的v_sql输出来执行,查询出来得结果就不正确,就是有一到两条符合条件的数据通过分页操作后就没了。
      

  2.   

    我就是跟踪v_sql产生的语句,然后带出来查询,查询的结果就是不正确的,
    改动rn 页码是总会有上一页的数据被带到下一下,
    我用新建个表加测试数据,用这个过程测试却没有问题。
    但是用实际项目的表时,就出错!
      

  3.   

    用输出的SQL查询结果就是不正确的,有一到两条数据查询不见。
      

  4.   

    知道怎么原因了!
    在p_SqlSelect 里加了排序,
    晕!