编写一个存储过程,要求可以输入表名、每页显示记录数和当前页,返回总记录数、总页数和结果集
--oracle的分页
select t1.*,rownum rn from (select * from emp) t1
select t1.*,rownum rn from (select * from emp) t1 where rn<=10;
--在分页时,大家可以把下面的sql语句当作一个模板使用
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rn<=10) where rn>=6;
--开发一个包,在该包中,我定义类型test_cursor,是个游标
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,--表名
pageSize in number,--一页显示记录数
pageNow in number,--当前页
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out testpackage.test_cursor--返回的记录集
)is
--定义部分
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSzie;
begin
--执行部份
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql
v_sql:='select count(*) from '||tableName;
--执行sql,并把返回的值赋给myrows;
execute immediate v_sql into myrows;
--计算myPageCount
if mod(myrows,PageSize)=0 then
myPageCount=myrows/PageSize;
else
myPageCount=myrows/PageSize+1;
end if;
--关闭游标
close p_cursor;
end;