create or replace package pagingPackage as
type paging_cursor is ref cursor;
end pagingPackage;
接下来开始Oracle的分页过程,我们可以用select emp.*,rownum from emp;来显示地表示出每行的行标。然后可以根据行标对内容进行分页,下面这个SQL语句可以作为Oracle分页的模板。
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=12)
where rn>=8;
有了上面的refcursor类型和分页模板,下面开始编写分页的存储过程,代码如下:
create procedure paging
(tableName in varchar2 ,--表名
pageSizes in number,--每页显示记录数
pageNow in number,--当前页
rowNums out number,--总记录数
pageNum out number,--总页数
paging_cursor out pagingPackage.paging_cursor) is
--定义部分
--定义sql语句,字符串
v_sql varchar2(1000);
--定义两个整数,用于表示每页的开始和结束记录数
v_begin number:=(pageNow-1)*pageSizes+1;
v_end number:=pageNow*pageSizes;
begin
--执行部分
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和sql语句关联
open paging_cursor for v_sql;
--计算rowNums和pageNum
--组织一个sql语句
v_sql:='select count(*) from '||tableName;
--执行该sql语句,并赋给rowNums
execute immediate v_sql into rowNums;
--计算pageNum
if mod(rowNums,pageSizes)=0 then
pageNum := rowNums/pageSizes;
else
pageNum := rowNums/pageSizes+1;
end if;
end;