

回忆前面前的分页方法,创建分页的过程,及在java中分页的方法
一、前面讲过oracle分页方法:把查询的结果当做内嵌视图使用
select t1.*,rownum rn from (select * from emp) t1; --给select * from emp查询的结果取名t1
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10; --取前10条
select * from (select t1.*,rownum rn from (select * from emp) t1 where rownum<=10) where rn>=6; --取第6到10条
可以把上面的当成分页的模板使用
二、开发一个并编写分页过程
--开发一个包
下面要使用上一节的包tespackage
--开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,--表名
PagesizeNum in number,--每页显示记录数
pageNow in number,--显示第几页
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out tespackage.test_cursor--返回记录集,tespackage是上一节建的包
) is
v_sql varchar2(1000);--sql语句字符串的长度1000个字符
v_begin number:=(pageNow-1)*PagesizeNum+1;--例,显示第1页,(1-1)*1+1=1,第2页,(2-1)*3+1=4
v_end number:=pageNow*PagesizeNum;--例,显示第1页,1*3=3 第2页,2*3=6
begin
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;--字符才需要引起来,最后是变量,所在最后没有引号
open p_cursor for v_sql;--把游标和sql关联,v_sql表上面的sql语句
v_sql:='select count(*) from '||tableName;
execute immediate v_sql into myrows; --执行sql语句,并把返回值赋给myrows;
if mod(myrows,PagesizeNum)=0 then--取模,这里只是判断能不能整除, 并不是要取余数
myPageCount:=myrows/PagesizeNum;--如能整除总页数myPageCount就等于除后的商
else
myPageCount:=myrows/PagesizeNum+1;--如不能整除表还有下一页,myPageCount的值就要要加1
end if;
--close p_cursor;--这里可以关闭游标
end;
/
show error; //通过该语句可以调试代码
三、在JAVA中测试分页过程
--使用java测试
package com.sp;
import java.sql.*;
public class callpro8 {
public static void main(String[] args) {
try{
Class.forName("oracle.jdbc.driver.OracleDriver"); //Class的C必需大写
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE1","scott","tiger");
CallableStatement cs=ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
cs.setString(1,"emp");//赋值表名emp为表名
cs.setInt(2,5); //5为每页显示记录数
cs.setInt(3,1); //1为当前第1页
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER); //输出参数,得到总记录数
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);//输出参数,得到总页数
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);//输出参数,游标变量,是个记录集
cs.execute();
int rowNum=cs.getInt(4);//取出总记录数,这里要注意,getInt(4)中4,是由该参数的位置决定的
int pageCount=cs.getInt(5);//取出总页数
ResultSet rs=(ResultSet)cs.getObject(6);//得到结果集
System.out.println("总记录数:"+rowNum);//输出总记录数,看看对不对
System.out.println("总页数:"+pageCount);//输出总页数
while(rs.next()){
System.out.println("编号:"+rs.getInt(1)+" 名字:"+rs.getString(2)+" 工资:"+rs.getFloat(6));
}
rs.close();
cs.close();
ct.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
新的需要,按照薪水从低到高排序,然后取出第6到第10个人
order by sal 在过程中加后再执行一遍