17. //给第二个?赋值
18. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.C URSOR); 19.
20. //5.执行
21. cs.execute(); 22. //得到结果集
23. ResultSet rs=(ResultSet)cs.getObject(2); 24. while(rs.next()){
25. System.out.println(rs.getInt(1)+\g(2)); 26. }
27. } catch(Exception e){ 28. e.printStackTrace(); 29. } finally{
30. //6.关闭各个打开的资源 31. cs.close(); 32. ct.close(); 33. } 34. } 35.}
运行,成功得出部门号是10 的所有用户 编写分页过程??
有了上面的基础,相信大家可以完成分页存储过程了。
要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前 页。返回总记录数,总页数,和返回的结果集。
如果大家忘了oracle 中如何分页,请参考第三天的内容。 先自己完成,老师在后面给出答案,并讲解。 --oracle 的分页 Sql 代码
1. select t1.*, rownum rn from (select * from emp) t1 where rownum <=10;
2. --在分页时,大家可以把下面的sql 语句当做一个模板使用 3. select * from
4. (select t1.*, rownum rn from (select * from emp) t1 where row num<=10)
5. where rn>=6; --开发一个包
--建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下: Sql 代码
1. create or replace package testpackage as 2. TYPE test_cursor is ref cursor; 3. end testpackage; 4. --开始编写分页的过程
5. create or replace procedure fenye 6. (tableName in varchar2,
7. Pagesize in number,--一页显示记录数 8. pageNow in number,
9. myrows out number,--总记录数 10. myPageCount out number,--总页数
11. p_cursor out testpackage.test_cursor--返回的记录集 12. ) is
13.--定义部分
14.--定义sql 语句 字符串 15.v_sql varchar2(1000); 16.--定义两个整数
17.v_begin number:=(pageNow-1)*Pagesize+1; 18.v_end number:=pageNow*Pagesize; 19.begin
20.--执行部分
21.v_sql:='select * from (select t1.*, rownum rn from (select * fr om '||tableName||') t1 where rownum<='||v_end||') where rn>='|| v_begin;
22.--把游标和sql 关联
23.open p_cursor for v_sql; 24.--计算myrows 和myPageCount 25.--组织一个sql 语句
26.v_sql:='select count(*) from '||tableName; 27.--执行sql,并把返回的值,赋给myrows; 28.execute inmediate v_sql into myrows; 29.--计算myPageCount
30.--if myrows%Pagesize=0 then 这样写是错的 31.if mod(myrows,Pagesize)=0 then 32. myPageCount:=myrows/Pagesize; 33.else
34. myPageCount:=myrows/Pagesize+1 35.end if; 36.--关闭游标
37.close p_cursor; 38.end; 39./
--使用java 测试 //测试分页 Java 代码
1. import java.sql.*; 2. public class FenYe{
3. public static void main(String[] args){ 4.
5. try{
6. //1.加载驱动
7. Class.forName(\8. //2.得到连接
9. Connection ct = DriverManager.getConnection(\racle:thin@127.0.0.1:1521:MYORA1\10.
11. //3.创建CallableStatement
12. CallableStatement cs = ct.prepareCall(\?,?,?,?,?,?)}\13.
14. //4.给第?赋值
15. cs.setString(1,\16. cs.setInt(2,5); 17. cs.setInt(3,2); 18.
19. //注册总记录数
20. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.I NTEGER);
21. //注册总页数
22. cs.registerOutParameter(5,oracle.jdbc.OracleTypes.I NTEGER);
23. //注册返回的结果集
24. cs.registerOutParameter(6,oracle.jdbc.OracleTypes.C URSOR); 25.
26. //5.执行
27. cs.execute(); 28.
29. //取出总记录数 /这里要注意,getInt(4)中4,是由该 参数的位置决定的
30. int rowNum=cs.getInt(4); 31.
32. int pageCount = cs.getInt(5);
33. ResultSet rs=(ResultSet)cs.getObject(6); 34.
35. //显示一下,看看对不对
36. System.out.println(\37. System.out.println(\总页数=\38.
39. while(rs.next()){
40. System.out.println(\编号:\1)+\名字: \2)+\工资:\6)); 41. }
42. } catch(Exception e){ 43. e.printStackTrace(); 44. } finally{
45. //6.关闭各个打开的资源 46. cs.close(); 47. ct.close(); 48. } 49. } 50.}
运行,控制台输出: rowNum=19 总页数:4
编号:7369 名字:SMITH 工资:2850.0 编号:7499 名字:ALLEN 工资:2450.0 编号:7521 名字:WARD 工资:1562.0 编号:7566 名字:JONES 工资:7200.0 编号:7654 名字:MARTIN 工资:1500.0
--新的需要,要求按照薪水从低到高排序,然后取出6-10 过程的执行部分做下改动,如下: Sql 代码 1. begin
2. --执行部分
3. v_sql:='select * from (select t1.*, rownum rn from (select * fr om '||tableName||' order by sal) t1 where rownum<='||v_end||') where rn>='||v_begin;
重新执行一次procedure,java 不用改变,运行,控制台输出: rowNum=19 总页数:4
编号:7900 名字:JAMES 工资:950.0 编号:7876 名字:ADAMS 工资:1100.0 编号:7521 名字:WARD 工资:1250.0 编号:7654 名字:MARTIN 工资:1250.0 编号:7934 名字:MILLER 工资:1300.0