select * from emp; --分页代码分解式第一步
select e.*,rownum rn from (select * from emp)e;--分页代码分解式第二步
select e.*,rownum rn from (select * from emp)e where rownum<10; ;--分页代码分解式第第三步
select * from (select e.*,rownum rn from (select * from emp)e where rownum<10) where rn>6; --最终的分页代码
然后看下oracle存储过程中的通用分页代码的写法
--由于返回值一个是集合,所以不能用一般的参数,必须先创建一个packageg,里面包含游标类型
--第一步创建一个package
create or replace package fengyepackage as
type fengye_cursor is ref cursor; --创建游标类型变量fengye_cursor
end fengyepackage;
--第二步创建一个procedure
create or replace procedure sp_fengye(pageNow in number,pageSise in number,tableName in varchar2,sortOrder in varchar2,pageCount out number,fengye_cursor out fengyepackage.fengye_cursor) is
v_rowCount number(2); --总记录数目
v_pageCount number(2); --总页数
v_fromline number(2); --从第v_fromline行开始获取返回值
v_toline number(2); --到v_toline number行结束
v_sql varchar2(1000); --装载sql语句的变量
begin
v_sql:='select count(*) from '||tableName; --组织一个sql
execute immediate v_sql into v_rowCount; --执行sql,并且把返回值赋给v_rowCount
if mod(v_rowCount,pageSise)=0 then --用v_rowCount%pageSise=0的取余数的方式是错误的,这是java代码里面的用法
v_pageCount:=v_rowCount/pageSise;
else
v_pageCount:=ceil(v_rowCount/pageSise); --ceil相当于加了1
end if;
v_toline:=pageNow*pageSise;
v_fromline:=(pageNow-1)*pageSise;
pageCount:=v_pageCount;
v_sql:='select * from (select e.*,rownum rn from (select * from '||tableName||' '||sortOrder||')e where rownum<='||v_toline||') where rn>'||v_fromline;--两个连接符号之间要用空格隔开,否则java程序无法识别
open fengye_cursor for v_sql;
--close fengye_cursor; --关闭游标,但是现在不能关闭否则java程序调用不到数据
--把游标的结果集传给JAVA的resultset之是不需要我们来手动的关闭游标的,因为JAVA把这个结果集接收过来的之后,如果JAVA对这个结果集操作完毕的话,JAVA会把这个结果集关闭掉的,不需要我们手动的去作任何操作!
end;