Oracle之存储过程实现分页

存储过程如下:
  1. --开发一个包   
  2. --建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:   
  3. create or replace package testpackage as    
  4. TYPE test_cursor is ref cursor;     
  5. end testpackage;     
  6.   
  7.   
  8. --开始编写分页的过程     
  9. create or replace procedure fenye     
  10. (tableName in varchar2,     
  11. Pagesize in number,--一页显示记录数     
  12. pageNow in number,     
  13. myrows out number,--总记录数     
  14. myPageCount out number,--总页数     
  15. p_cursor out testpackage.test_cursor--返回的记录集     
  16. is    
  17. --定义部分     
  18. --定义sql语句 字符串     
  19. v_sql varchar2(1000);     
  20. --定义两个整数     
  21. v_begin number:=(pageNow-1)*Pagesize+1;     
  22. v_end number:=pageNow*Pagesize;     
  23. begin    
  24. --执行部分     
  25. v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;     
  26. --把游标和sql关联     
  27. open p_cursor for v_sql;     
  28. --计算myrows和myPageCount     
  29. --组织一个sql语句     
  30. v_sql:='select count(*) from '||tableName;     
  31. --执行sql,并把返回的值,赋给myrows;     
  32. execute immediate v_sql into myrows;     
  33. --计算myPageCount     
  34. --if myrows%Pagesize=0 then这样写是错的     
  35. if mod(myrows,Pagesize)=0 then    
  36. myPageCount:=myrows/Pagesize;     
  37. else    
  38. myPageCount:=myrows/Pagesize+1;  
  39. end if;     
  40. --关闭游标     
  41. close p_cursor;     
  42. end;     

  1. Java端代码:   
    1. import java.sql.CallableStatement;  
    2. import java.sql.Connection;  
    3. import java.sql.DriverManager;  
    4. import java.sql.ResultSet;  
    5. import java.sql.SQLException;  
    6.   
    7. public class Fenye  
    8. {  
    9.     public static void main(String[] args)  
    10.     {  
    11.         Connection ct = null;  
    12.         CallableStatement cs = null;  
    13.         try  
    14.         {  
    15.             // 1.加载驱动  
    16.             Class.forName("oracle.jdbc.driver.OracleDriver");  
    17.             // 2.得到连接  
    18.             ct = DriverManager.getConnection(  
    19.                     "jdbc:oracle:thin:@127.0.0.1:1521:orcl""HONG""123");  
    20.   
    21.             // 3.创建CallableStatement  
    22.             cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");  
    23.   
    24.             // 4.给第?赋值  
    25.             cs.setString(1"emp");  
    26.             cs.setInt(25);  
    27.             cs.setInt(32);  
    28.   
    29.             // 注册总记录数  
    30.             cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);  
    31.             // 注册总页数  
    32.             cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);  
    33.             // 注册返回的结果集  
    34.             cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);  
    35.   
    36.             // 5.执行  
    37.             cs.execute();  
    38.   
    39.             // 取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的  
    40.             int rowNum = cs.getInt(4);  
    41.   
    42.             int pageCount = cs.getInt(5);  
    43.             ResultSet rs = (ResultSet) cs.getObject(6);  
    44.   
    45.             // 显示一下,看看对不对  
    46.             System.out.println("rowNum=" + rowNum);  
    47.             System.out.println("总页数=" + pageCount);  
    48.   
    49.             while (rs.next())  
    50.             {  
    51.                 System.out.println("编号:" + rs.getInt(1) + " 名字:"  
    52.                         + rs.getString(2) + " 工资:" + rs.getFloat(6));  
    53.             }  
    54.         } catch (Exception e)  
    55.         {  
    56.             e.printStackTrace();  
    57.         } finally  
    58.         {  
    59.             // 6.关闭各个打开的资源  
    60.             try  
    61.             {  
    62.                 if (null != cs)  
    63.                 {  
    64.                     cs.close();  
    65.                 }  
    66.             } catch (SQLException e)  
    67.             {  
    68.                 e.printStackTrace();  
    69.             }  
    70.             try  
    71.             {  
    72.                 if (null != ct)  
    73.                 {  
    74.                     ct.close();  
    75.                 }  
    76.   
    77.             } catch (SQLException e)  
    78.             {  
    79.                 e.printStackTrace();  
    80.             }  
    81.         }  
    82.     }  
    83.   
    84. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值