ORACLE分页的存储过程

/*
编写一个存储过程,要求输入表名、每页显示记录数、当前页。
返回总记录数、总页数,和返回的结果集
*/
--这个是分页查询的模板
 select t2.* ,rn from(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)t2 where rn>=6;
 
 
 --创建一个包,在该包中,我定义一个类型page_cursor,是个游标
 create or replace package pagePackage as
 type page_cursor is ref cursor;
 end pagePackage;
 
 
 
 
 
 
 --开始编写分页过程
 create or replace procedure mypage
 (tableName in varchar2,--表名
 sizeOfPage in number,--每页显示记录数
 PageNow in number,--当前页
 myrows out number,--返回的总记录数
 myPageCount out number,--总页数
 result_cursor out pagePackage.page_cursor--返回的总记录集
 )is
 --定义部分
 --定义一个sql语句 字符串
 v_sql varchar2(1000);
 v_begin number:=1+(pageNow-1)*sizeOfPage;
 v_end number:=pageNow*sizeOfPage;
 begin
 --执行部分
 v_sql:='select t2.* ,rn from(select t1.*,rownum rn from (select * from '||tableName
 ||') t1 where rownum<='||v_end
 ||')t2 where rn>='||v_begin;
 --把游标和sql关联
 open result_cursor for v_sql;
 --此处若关闭游标,java代码查询不出结果
 --close result_cursor;
 --计算myrows、myPageCount
 --组织一个sql
 v_sql:= 'select count(*) from '||tableName;
 
 --执行sql,并把执行结果赋值给参数myrows
 execute immediate v_sql into myrows;   
 
 if mod(myrows,sizeOfPage)=0 then
     myPageCount:=myrows/sizeOfPage;
  else
      myPageCount:=myrows/sizeOfPage+1;  
 end if;  
 --此处若关闭游标,java代码也查询不出结果
 --close result_cursor;
 end;

 



package com.freeborders.page;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Page {

    /**
     * @param args
     */
    static String dbUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
    //theUser为数据库用户名
    static String theUser = "scott";
    //thePw为数据库密码
    static String thePw = "tiger";

    public Page(){
    
    }
    public static void main(String[] args)  {
        // TODO Auto-generated method stub
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection(dbUrl, theUser, thePw);
            CallableStatement cs = conn.prepareCall("{call mypage(?,?,?,?,?,?)}");
            //给存储过程的前三个输入in类型的参数赋值
            cs.setString(1, "emp");
            cs.setInt(2, 2);//每页显示两条
            cs.setInt(3, 1);//取出当前页第1页的数据
            //给存储过程的输出参数注册
            cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
            cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
            cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
            //执行存储过程
            cs.execute();

            
            //取出总记录数
            int rowNums = cs.getInt(4);
            //取出总页数
            int pageNums = cs.getInt(5);
            //取出结果集
            ResultSet rs = (ResultSet)cs.getObject(6);
            
            System.out.println("总记录数"+rowNums+" 总页数: "+pageNums);
            //将存储过程返回的结果集迭代输出
            
            
            while(rs.next()){
                System.out.println("姓名:"+rs.getString(2)+" 工资: "+rs.getFloat(6));
            }
        }
        catch(Exception e){
            e.getMessage();
        }
        
        
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值