Oracle分页存储过程及java的具体调用方法

本文介绍了一个用于Oracle数据库的分页查询存储过程及对应的Java类。该存储过程可以根据表名、查询条件、排序字段等参数执行分页查询,并返回指定页数的数据记录。Java类则通过调用此存储过程实现了对数据库的高效分页访问。

--包

create or replace package pkg_query as
  type cur_query is ref cursor;
end pkg_query;

--过程

 

CREATE OR REPLACE  PROCEDURE "PRC_QUERY" (p_tableName  
        in  varchar2,   --表名
        p_strWhere         in  varchar2,   --查询条件
        p_orderColumn      in  varchar2,   --排序的列
        p_orderStyle       in  varchar2,   --排序方式
        p_curPage          in out Number,  --当前页
        p_pageSize         in out Number,  --每页显示记录条数
        p_totalRecords     out Number,     --总记录数
        p_totalPages       out Number,     --总页数
        v_cur              out pkg_query.cur_query)   --返回的结果集
IS
   v_sql VARCHAR2(1000) := '';      --sql语句
   v_startRecord Number(4);         --开始显示的记录条数
   v_endRecord Number(4);           --结束显示的记录条数
BEGIN
   --记录中总记录条数
   v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || p_strWhere;
   END IF;
   EXECUTE IMMEDIATE v_sql INTO p_totalRecords;

   --验证页面记录大小
   IF p_pageSize < 0 THEN
       p_pageSize := 0;
   END IF;

   --根据页大小计算总页数
   IF MOD(p_totalRecords,p_pageSize) = 0 THEN
       p_totalPages := p_totalRecords / p_pageSize;
   ELSE
       p_totalPages := p_totalRecords / p_pageSize + 1;
   END IF;

   --验证页号
   IF p_curPage < 1 THEN
       p_curPage := 1;
   END IF;
   IF p_curPage > p_totalPages THEN
       p_curPage := p_totalPages;
   END IF;

   --实现分页查询
   v_startRecord := (p_curPage - 1) * p_pageSize + 1;
   v_endRecord := p_curPage * p_pageSize;
   v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
            '(SELECT * FROM ' || p_tableName;
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
   END IF;
   IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
       v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
   END IF;
   v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
            || v_startRecord;
   DBMS_OUTPUT.put_line(v_sql);
   OPEN v_cur FOR v_sql;
END prc_query;


//java的一个分页类
package XXT.DB;
import java.sql.*;
import java.util.*;
import oracle.jdbc.driver.OracleTypes;

public class BestOraclePageBean {


     //获得数据需要的参数
     private Connection conn;//数据库连接对象

     private String s_tableName="";//从那个表中取数据
     private String s_whereCondition="";//条件
     private String s_orderColumn="";//排序字段,不能为空!
        private String s_orderStyle ="ASC";//按升序还是降序排列数据,ASC 升序,DESC降序

     private int i_totalRecords;//满足条件的数据库中的记录数
     private int i_curPage=1;//当前页
     private int i_totalPages;//如果按照每页显示的数据行数,则共可以显示的页面数
     private int i_multiple=10; //一次从数据库中取出的数据,是每页显示的数据的倍数
     private int i_pageSize=20;//每页显示的数据行数
 
     private Vector pageData;//存放一次要显示的数据

     public BestOraclePageBean() {
         pageData=new Vector();
      }
     public BestOraclePageBean(Vector v) {
         pageData=v;
      }
     public void setData(Vector v) {
         pageData=v;
      }
     public void setConnecton(Connection con) {
         this.conn=con;
     }
     public void setTableName(String tablename) {
         this.s_tableName =tablename;
         //取出字段个数
       /*
   try {
    Statement stmt= conn.createStatement();
    ResultSet rs=stmt.executeQuery("Select  count( *)   From   Syscolumns C, Sysobjects N where N.id=C.id and N.name='"+this.s_TableName+"'");
          rs.next();
          i_FieldsCount=rs.getInt(1);
          rs.close();
          stmt.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    System.out.println("获得表的字段个数错误"+e.toString());
   }
         */

     }
  
     public void setWhereCondition(String strWhere) {
         this.s_whereCondition =strWhere;
     }
     public void setOrderFieldName(String orderField) {
         this.s_orderColumn =orderField;
     }
     public void setOrderStyle(String orderStyle) {
         this.s_orderStyle =orderStyle;
     }

     public void setPageSize(int pageSize) {
         this.i_pageSize = pageSize;
      
     }
     public void setMultiple(int multiple) {
         this.i_multiple = multiple;
     }
     public int getTotalRecords() {
         return this.i_totalRecords;
     }

     public int getCurPage() {
         return this.i_curPage;
     }

     public int getPageSize() {
         return this.i_pageSize;
     }
     public int getTotalPages() {
         return this.i_totalPages;
     }
     public int getMultiple() {
         return this.i_multiple;
        
     }
     //得到每页的数据
     public ResultSet getPageData(int page) {
         this.i_curPage=page;
         pageData.clear();
       
         CallableStatement call = null;
         ResultSet rs=null;
         try {
           String sql= "{ call prc_query(?,?,?,?,?,?,?,?,?) }";
      call = conn.prepareCall(sql);
       call.setString(1,this.s_tableName);
       call.setString(2,this.s_whereCondition);
       call.setString(3,this.s_orderColumn);
       call.setString(4,this.s_orderStyle);
       call.setInt(5,this.i_curPage);
       call.setInt(6,this.i_pageSize);
       call.registerOutParameter(5,OracleTypes.INTEGER);
       call.registerOutParameter(6,OracleTypes.INTEGER);
       call.registerOutParameter(7,OracleTypes.INTEGER);
       call.registerOutParameter(8,OracleTypes.INTEGER);
          call.registerOutParameter(9, OracleTypes.CURSOR);
       call.execute();
       this.i_curPage=(int)call.getInt(5);
       this.i_pageSize=(int)call.getInt(6);
       this.i_totalRecords=(int)call.getInt(7);
       this.i_totalPages=(int)call.getInt(8);
       rs=(ResultSet) call.getObject(9);
          return rs;
         } catch (SQLException ex) {
             System.out.println("调用存储过程获得数据错误:"+ex.toString());
             return null;
         }
        
     }

   

 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值