--分页存储过程: 输入表名、每页显示记录数、当前页。返回总记录数、总页数和返回的结果集
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;
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;
Loop
dbms_output.put_line(temp.*);
End Loop; 直接遍历游标试试
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;
/
试试。