我的存储过程如下:CREATE OR REPLACE  PACKAGE PageTest
is
  type T_CURSOR is ref cursor;
  Procedure Per_QuickPage
  (
      p_PageSize in number,          --每页记录数
      p_PageNo in number,            --当前页码,从 1 开始
      p_TableName in varchar2,       --表名
      p_SqlSelect in varchar2,       --查询语句,含排序部分
      p_order  in varchar,           --含排序部分
      p_OutRecordCount out number,   --返回总记录数
      p_OutCursor out T_CURSOR  );
end PageTest;create or replace package body PageTest
is
procedure Per_QuickPage
(
      p_PageSize in number,       --每页记录数
      p_PageNo in number,         --当前页码,从 1 开始
      p_TableName in varchar2,    --表名
      p_SqlSelect in varchar2,    --查询语句,
      p_order  in varchar,           --含排序部分
      p_OutRecordCount out number,--返回总记录数
      p_OutCursor out T_CURSOR
)
as
    v_sql varchar2(3000);
    v_count int;
    v_heiRownum int;
    v_lowRownum int;
begin
  ----取记录总数
  if p_SqlSelect is not null then 
     v_sql :='select count(*)  from '|| p_TableName ||'  '|| p_SqlSelect ||'  '|| p_order  ;
  else
     v_sql :='select count(*)  from '|| p_TableName||'  '|| p_order ;
  end if ;
  execute immediate v_sql into v_count;
  p_OutRecordCount := v_count;
  ----执行分页查询
  v_heiRownum := p_PageNo * p_PageSize;
  v_lowRownum := v_heiRownum - p_PageSize + 1;
  if p_SqlSelect is not null then 
  v_sql := 'SELECT * 
            FROM (
                  SELECT A.*, rownum rn 
                  FROM  '|| p_TableName || '  A '|| ' '|| p_SqlSelect ||'
                  and rownum <= '|| to_char(v_heiRownum) || ''|| p_order ||'
                 ) B WHERE rn >= ' || to_char(v_lowRownum) ; 
                         
                 
 else
    v_sql := 'SELECT * 
            FROM (
                  SELECT A.*, rownum rn 
                  FROM  '|| p_TableName || '  A 
                  WHERE rownum <= '|| to_char(v_heiRownum) || ' '|| p_order ||'
                 ) B WHERE rn >= ' || to_char(v_lowRownum) ; 
  end if;
  
  OPEN p_OutCursor FOR  v_sql;
  
end Per_QuickPage;
end PageTest; 
这个存储过程编译可以通过,并且可以取到记录,但是有一个很郁闷的问题,我在.net中使用gridview控件调用这个分页的存储过程,如果可以取到两页的记录,在第一页的时候,这个排序的条件是正确的,但是翻到第二页后,这个排序的条件就不对了,真是郁闷这应该是存储过程的问题吧,,请教各位,改改这个存储过程,得到正确答案,立即结贴!

解决方案 »

  1.   

    把分页中的
     rownum rn 
    改成 row_number() over(order by p_order)感觉是你没排序就rownum,这个不是你想要的结果
    试下
      

  2.   

    或者多套层在写rownum
    象我下面写的那样,你试下
    'SELECT * 
                FROM (
                      SELECT A.*, rownum rn from 
                      (
                      select * FROM  '|| p_TableName || '  A '|| ' '|| p_SqlSelect ||' '|| p_order 
                      )
                      where rownum <= '|| to_char(v_heiRownum) 
                     ) B WHERE rn >= ' || to_char(v_lowRownum) ; 
    最后看下http://blog.sina.com.cn/u/499de7810100093o
      

  3.   

    HelloWorld_001,你的方法我试了,没有效果,而且还会报错,当然不是编译报错,是运行报错
      

  4.   

    哈哈,我的Oracle也丢了一年多罗
      

  5.   

    改为:
    v_heiRownum := p_PageNo * p_PageSize + 1; //必须加1,不然始终是(整数)上一页的最后一条
    v_lowRownum := v_heiRownum - p_PageSize + 1;
      

  6.   

    搞.NET的 oracle好的估计不多 我也N久不用了
      

  7.   

    SELECT * 
                FROM (
                      SELECT * from 
                      (
                      select A.*,rownum as rn FROM  '|| p_TableName || '  A '|| ' '|| p_SqlSelect ||' '|| p_order 
                      )
                      where rn< '|| to_char(v_heiRownum) 
                     ) B WHERE rn >= ' || to_char(v_lowRownum) ;要把rownum写在最里面,我开始写错了,不好意思!现在的是对的了,或者看我贴的那文章
      

  8.   

    oracle丢了好久了,很多东西都想不起了
      

  9.   

    呵呵 我认识oracle,它不认识我! ……
      

  10.   

    谢谢大尾巴狼,我是这样写的
    SELECT *
                FROM (
                      SELECT A.*, rownum rn
                      FROM  (select * from '|| p_TableName || ' '|| p_SqlSelect ||' '|| p_order||')
                      A  where rownum <= '|| to_char(v_heiRownum) ||')
                      WHERE rn >= ' || to_char(v_lowRownum) ;