Oracle 分页存储过程
分页存储过程:入参为基本的sql语句、分页大小、当前页,出参为总记录数、总页数、查询结果集。[*]--分页存储过程
[*]create or replace procedure paging
[*](baseSql invarchar2, --基本的sql语句
[*] pageSize innumber, --分页大小
[*] pageCurrent innumber, --当前页
[*] rowCount out number, --总记录数
[*] pageCount out number, --总页数
[*] p_cursor out p_paging.paging_cur --返回的结果集
[*] ) is
[*] --定义部分
[*] --定义sql语句,字符串变量
[*] v_sql varchar2(1000);
[*] --查询起始值
[*] v_begin number := (pageCurrent - 1) * pageSize + 1;
[*] --查询结束值
[*] v_end number :=pageCurrent * pageSize;
[*] begin
[*] --执行部分
[*] v_sql := 'select * from
[*](select t.*,rownum rn from ('||baseSql||')t where rownum = '||v_begin;
[*] --把游标和sql关联
[*] open p_cursor for v_sql;
[*] --重新赋值v_sql,计算总记录数
[*] v_sql := 'select count(1) from ('||baseSql||')';
[*] --执行sql语句,把返回值赋给rowCount
[*] execute immediate v_sql into rowCount;
[*] --计算总页数
[*] if mod(rowCount,pageSize) = 0 then
[*] pageCount := rowCount/pageSize;
[*] else
[*] pageCount := rowCount/pageSize + 1;
[*] end if;
[*] --close p_cursor;
[*] end;
辅助的包package:
[*]--创建一个包,定义一个游标类型
[*]create or replace package p_paging as
[*]--游标参照变量
[*]type paging_cur is ref cursor;
[*]end p_paging;
测试分页存储过程的java类:
[*]public class TestPagingProcedure
[*]{
[*]
[*] /**
[*] * Discription:[测试分页存储过程]
[*] * @param args
[*] * @author:
[*] * @update: [创建]
[*] */
[*]
[*] public static void main(String[] args)
[*] {
[*] Connection conn = null;
[*] CallableStatement cs = null;
[*] ResultSet rs = null;
[*] String sql = "select * from emp";//查询sql语句
[*] int pageSize = 5;//分页大小
[*] int pageCurrent = 1;//当前页
[*] try
[*] {
[*] Class.forName("oracle.jdbc.driver.OracleDriver");
[*] conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
[*] //调用存储过程
[*] cs = conn.prepareCall("{call paging(?,?,?,?,?,?)}");
[*] //设置sql语句
[*] cs.setString(1, sql);
[*] //设置分页大小
[*] cs.setInt(2, pageSize);
[*] //设置当前页
[*] cs.setInt(3, pageCurrent);
[*] //注册总记录数
[*] cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
[*] //注册总页数
[*] cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
[*] //注册返回的结果集
[*] cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
[*] //执行查询
[*] cs.execute();
[*] //取出总记录数和总页数,注意:getInt(4)中的4是由该参数的位置决定的
[*] int rowNum = cs.getInt(4);
[*] int pageCount = cs.getInt(5);
[*]
[*] //取出结果集
[*] rs = (ResultSet)cs.getObject(6);
[*]
[*] //显示总记录数和总页数
[*] System.out.println("rowNum = " + rowNum);
[*] System.out.println("pageCount = " + pageCount);
[*] //遍历结果集
[*] while(rs.next())
[*] {
[*] System.out.println("员工编号:"+rs.getInt("empno")+" 名字:"+rs.getString("ename"));
[*] }
[*] }
[*] catch (Exception e)
[*] {
[*] System.out.println("查询失败!");
[*] }
[*] finally
[*] {
[*] try
[*] {
[*] if(rs!=null)
[*] {
[*] rs.close();
[*] }
[*] if(cs!=null)
[*] {
[*] cs.close();
[*] }
[*] if(conn!=null)
[*] {
[*] conn.close();
[*] }
[*] }
[*] catch (SQLException e)
[*] {
[*] System.out.println("关闭失败!");
[*] }
[*] }
[*] }
[*]}
页:
[1]