--分页存储过程: 输入表名、每页显示记录数、当前页。返回总记录数、总页数和返回的结果集
create or replace procedure fenye(tablename in varchar2, --表名
                                  pagesize  in number,   --每页显示数
                                  pagenow   in number,   --当前页数
                                  totalrows out number,  --总记录数
                                  totalpage out number,  --总页书
                                  p_cursor  out fenyepackage.fenye_cursor --返回结果集
                                  ) is
  ---定义部分
  v_sql   varchar2(1024);
  v_begin number := (pagenow - 1) * pagesize + 1;  
  v_end   number := pagenow * pagesize;
    ---开始部分
begin
  v_sql := ' select *from ( select t.*, rownum rn
   from (select * from ' || tablename || ') t
   where rownum <= ' || v_end || ') where rn >=' || v_begin;
  --把游标和sql关联
  open p_cursor for v_sql;
  --计算totalrows 和totalpage
  v_sql := 'select count(*) from ' || tablename;
  --执行sql,并把返回的值,赋给totalrows;
  execute immediate v_sql
    into totalrows;
  --计算totalpage
  if mod(totalrows, pagesize) = 0 then
    totalpage := totalrows / pagesize;
  else
    totalpage := totalrows / pagesize + 1;
  end if;
  --关闭游标
  close p_cursor;
---结束部分  
end;

解决方案 »

  1.   

    for temp in p_cursor
    Loop 
          dbms_output.put_line(temp.*); 
     End Loop; 直接遍历游标试试
      

  2.   

    sqlplus username/password
    set serveroutput ondeclare
        v_reccnt number;
        v_pgcnt number;
         v_cur fenyepackage.fenye_cursor;
    begin
      fenye('tabname',20,10,v_reccnt,v_pgcnt,v_cur);
      for temp in p_cursor Loop 
           dbms_output.put_line(temp.*); 
      End Loop; 
    end;
    /
    试试。