存储过程(分页显示)(2)

2019-03-22 15:42

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


存储过程(分页显示)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:牛津版7A Unit 3 知识点讲解

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: