oracle实现分页的存储过程

来源:互联网 发布:数据库系统概论 微盘 编辑:程序博客网 时间:2024/05/22 06:16

 

 

第一步:创建包及其游标
 
代码如下:
 
Code:
  1. ----建包及创建游标--------  
  2.   
  3. CREATE OR REPLACE PACKAGE sp_package_page AS   
  4. TYPE pages_cursor IS REF CURSOR;  
  5. END;  
  6.   
  7. ----建包及创建游标--------  
 
 
第二步:实现分页存储过程的编写
代码如下:
 
Code:
  1. ----实现分页存储过程------  
  2.   
  3. CREATE OR REPLACE PROCEDURE sp_pages_test(  
  4. tabName IN varchar2,--表名  
  5. currentPage IN NUMBER,--当前页数  
  6. pageCount IN NUMBER,--每页显示的条数  
  7. currentRows OUT NUMBER,--表中的所有数据  
  8. currentPageCount OUT NUMBER,--总页数  
  9. p_cursor OUT sp_package_page.pages_cursor)--返回的记录集  
  10. IS  
  11. --定义部分  
  12. --定义SQL语句字符串  
  13. v_sql VARCHAR2(1000);  
  14. --定义两个整数,计算开始条数和结束条数  
  15. v_begin NUMBER:=(currentPage-1)*pageCount+1;  
  16. v_end NUMBER:=currentPage*pageCount;  
  17. BEGIN  
  18. --执行部分  
  19. v_sql:='SELECT * FROM (SELECT * FROM (SELECT t.*,ROWNUM spno FROM (SELECT * FROM '|| tabName ||' ) t) WHERE spno<='|| v_end ||') WHERE spno>='|| v_begin;  
  20. --把游标和sql语句关联  
  21. OPEN p_cursor FOR v_sql;  
  22. --计算currentRows和currentPageCount  
  23. --组织一个sql  
  24. v_sql:='SELECT COUNT(*) FROM '|| tabName ;  
  25. --执行sql语句  
  26. EXECUTE IMMEDIATE v_sql INTO currentRows;  
  27. --计算currentPageCount  
  28. IF MOD(currentRows,pageCount)=0 THEN  
  29. currentPageCount:=currentRows/pageCount;  
  30. ELSE  
  31. currentPageCount:=currentRows/pageCount+1;  
  32. END IF;  
  33. END;  
  34.   
  35. ----实现分页存储过程------  
 
 
 
 
第三步:在java程序中调用实现分页的存储过程
代码如下:
Code:
  1. package com.procedure.test;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7.   
  8. public class ProcedureTest2 {  
  9.   
  10.     /** 
  11.      * ORACLE数据库存储过程调用 
  12.      * 以下操作必须用ORACLE11G 的驱动包 
  13.      * @param args 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         try {  
  17.             //1.加载驱动类  
  18.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  19.             //2.获取连接对象  
  20.             Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:VINCENT","SCOTT","tiger");  
  21.             //3.创建CallableStatement对象  
  22.             CallableStatement cs=conn.prepareCall("{call sp_pages_test(?,?,?,?,?,?)}");  
  23.             //4.为存储过程设置参数  
  24.             cs.setString(1"emp");  
  25.             cs.setInt(21);  
  26.             cs.setInt(32);  
  27.             cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);  
  28.             cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);  
  29.             cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);  
  30.                         //5.执行  
  31.             cs.execute();  
  32.                         //6.取值  
  33.             System.out.println("总共有"+cs.getInt(4)+"条数据!");  
  34.             System.out.println("总页数"+cs.getInt(5)+"!");  
  35.             ResultSet rs=(ResultSet)cs.getObject(6);  
  36.             while (rs.next()) {  
  37.                 System.out.println(rs.getString("ename"));  
  38.                                 System.out.println(rs.getString("job"));  
  39.                 System.out.println(rs.getDouble("sal"));  
  40.                   
  41.             }  
  42.             cs.close();  
  43.             conn.close();  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.   
  48.     }  
  49.   
  50. }  
 
 
 
原创粉丝点击