我有如下sqlserver存储过程,经理要我转换成oracle,而且比较急,而且oracle我从来没有接触过。麻烦大哥们帮我接困,谢谢CREATE  PROCEDURE  sp_page
   @tb                  varchar(50),  --表名  
   @col                varchar(50),  --按该列来进行分页  
   @coltype        int,                  --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型  
   @orderby        bit,                  --排序,0-顺序,1-倒序  
   @collist        varchar(800),--要查询出的字段列表,*表示全部字段  
   @pagesize      int,                  --每页记录数  
   @page              int,                  --指定页  
   @condition    varchar(800),--查询条件  
   @pages            int  OUTPUT      --总页数  
AS  
/*  
功能描述:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序  
                 查询可以指定页大小、指定查询任意页、指定输出字段列表,返回总页数  
作        者:pbsql  
版        本:1.10  
最后修改:2004-11-29  
*/  
DECLARE  @sql  nvarchar(4000),@where1  varchar(800),@where2  varchar(800)  
IF  @condition  is  null  or  rtrim(@condition)=''  
BEGIN--没有查询条件  
   SET  @where1='  WHERE  '  
   SET  @where2='    '  
END  
ELSE  
BEGIN--有查询条件  
    SET  @where1=@condition+'  AND  '
    SET  @where2=@condition
   --SET  @where1='  WHERE  ('+@condition+')  AND  '--本来有条件再加上此条件  
   --SET  @where2='  WHERE  ('+@condition+')  '--原本没有条件而加上此条件  
END  
SET  @sql='SELECT  @pages=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize  AS  varchar)+  
                 ')  FROM  '+@tb+@where2  
EXEC  sp_executesql  @sql,N'@pages  int  OUTPUT',@pages  OUTPUT--计算总页数  
IF  @orderby=0  
   SET  @sql='SELECT  TOP  '+CAST(@pagesize  AS  varchar)+'  '+@collist+  
                     '  FROM  '+@tb+@where1+@col+'>(SELECT  MAX('+@col+')  '+  
                     '  FROM  (SELECT  TOP  '+CAST(@pagesize*(@page-1)  AS  varchar)+'  '+  
                     @col+'  FROM  '+@tb+@where2+'ORDER  BY  '+@col+')  )  ORDER  BY  '+@col  
ELSE  
   SET  @sql='SELECT  TOP  '+CAST(@pagesize  AS  varchar)+'  '+@collist+  
                     '  FROM  '+@tb+@where1+@col+'<(SELECT  MIN('+@col+')  '+  
                     '  FROM  (SELECT  TOP  '+CAST(@pagesize*(@page-1)  AS  varchar)+'  '+  
                     @col+'  FROM  '+@tb+@where2+'ORDER  BY  '+@col+'  DESC)  t)  ORDER  BY  '+  
                     @col  +'  DESC'
IF  @page=1--第一页  
   SET  @sql='SELECT  TOP  '+CAST(@pagesize  AS  varchar)+'  '+@collist+'  FROM  '+@tb+  
       @where2+'ORDER  BY  '+@col+CASE  @orderby  WHEN  0  THEN  ''  ELSE  '  DESC'  END  
EXEC(@sql)
GO

解决方案 »

  1.   

    procedure sp_Page(p_PageSize int,          --每页记录数
                    p_PageNo int,            --当前页码,从 1 开始
                    p_SqlSelect varchar2,    --查询语句,含排序部分
                    p_SqlCount varchar2,     --获取记录总数的查询语句
                    p_OutRecordCount out int,--返回总记录数
                    p_OutCursor out sys_refcursor)
    as
        v_sql varchar2(3000);
        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;end sp_Page;
    不如直接用这个做分页了