下面是我用sql server 2000写的存储过程分页,怎么把它改成oracle的存储过程:
--根据传进来的类型id自定义分页绑定数据
create proc more_message
(
@t_id int,--传过来的id
@PageIndex int,--显示哪一页
@PageSize int ,--每页显示多少行
@PageCount int output--总共多少页
)
as
declare @total_cow int--定义总的行数
set @total_cow=(select count(*) from article where t_id=@t_id)
if (@total_cow%@PageSize)>0
begin 
set @PageCount=(@total_cow/@PageSize)+1
end
if (@total_cow%@PageSize)=0
begin
set @PageCount=(@total_cow/@PageSize)
enddeclare @Page_before int  --定义要显示的页面前面有多少行
set @Page_before=@PageSize*@PageIndexdeclare @sqlstr varchar(2000)
set @sqlstr='select top '+cast(@PageSize as varchar)+'* from article
where t_id='+cast(@t_id as varchar)+' and a_id not in( 
select top '+cast(@Page_before as varchar)+'a_id from article
where t_id='+cast(@t_id as varchar)+'  order by a_time desc 
) order by a_time desc'
exec(@sqlstr)GO
或者谁有写过oracle存储过程分页的发一个上来看看。

解决方案 »

  1.   

    oracle的分页比sql server简单得多.不需要写这么复杂的东西.
    如:select * from (select table.*,row_number over(order by aa desc) rk from table ) where rk>=1 and rk<=100
      

  2.   

    create or replace package Tools
    is
      type ResultData is ref cursor;
      procedure sp_Page(p_PageSize int,          --每页记录数
                      p_PageNo int,            --当前页码,从 1 开始
                      p_SqlSelect varchar2,    --查询语句,含排序部分
                      p_SqlCount varchar2,     --获取记录总数的查询语句
                      p_OutRecordCount out int,--返回总记录数
                      p_OutCursor out ResultData);
    end Tools;create or replace package body Tools
    is
      procedure sp_Page(p_PageSize int,          --每页记录数
                      p_PageNo int,            --当前页码,从 1 开始
                      p_SqlSelect varchar2,    --查询语句,含排序部分
                      p_SqlCount varchar2,     --获取记录总数的查询语句
                      p_OutRecordCount out int,--返回总记录数
                      p_OutCursor out ResultData)
      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;end Tools;
      

  3.   

    ORACLE中分页,主要是以下两点:
    1、存储过程传入(in)当前页数(页码)和每页显示记录数
    2、根据1中传入的两个参数curr_page,count_records写查询语句
       查询结果的rownum满足以下关系:
       (curr_page-1)*count_records < rownum <= curr_page*count_records
    做到以上两点,即实现分页
      

  4.   

    上面的这个分页运行得过,但是怎么执行呢?我自己是这样执行的,但是运行不过呀?declare
    allcount int;
    type cur is ref cursor;
    begin
     tools.sp_Page(3,2,'select * from emp','select count(*) from emp',allcount,cur);
     dbms_output.put_line(allcount);
     dbms_output.put_line(cur);
    end;
    /
      

  5.   

    对于上面这种存储过程分页,可否发一些代码过来看看在asp.net是怎么调用这个存储过程的,因为这个存储过程中有游标,
    自己又不懂.还有的,对于上面这个存储过程,为什么不能直接用 rownum <= '|| to_char(v_heiRownum) || ' AND rownum >= ' || to_char(v_lowRownum)????
      

  6.   

    为什么上面的代码我在oracle8i里运行出现错误,点parameter的时候提示错误
      

  7.   

    执行的时候因为cur的错误,剔掉就行了。