Oracle 存储过程-实现分页 + 代码案例
1 // 分页的操作 2 3 public void pro_fenye(String tname,int pagesize,int pagenow){ 4 try { 5 System.out.println("haha"); 6 CallableStatement cs = conn.prepareCall("{call pro_fenye(?,?,?,?,?,?)}"); 7 // 设置参数 8 // 输入参数设置 9 cs.setString(1, tname); 10 cs.setInt(2, pagesize); 11 cs.setInt(3,pagenow); 12 // 输出参数设置 13 cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); 14 cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); 15 cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); 16 //执行语句 17 cs.execute(); 18 rs = (ResultSet)cs.getObject(4); 19 System.out.println(rs); 20 // 获得总条数 21 System.out.println(cs.getInt(5)); 22 // 获得总页数 23 System.out.println(cs.getInt(6)); 24 } catch (SQLException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 }
--PLSQL代码
--使用包定义游标变量类型 create or replace package package_fenye is -- 定义游标变量 type cursor_type is ref cursor; end; -- 分页的存储过程完整版 create or replace procedure pro_fenye( -- 进入存储过程的值 v_tablename in varchar2, -- 表名 v_pagesize in number, -- 规定每一页显示的数据条数 v_pagenow in number, -- 当前需要显示的页数 -- 返回的数据 -- 当前没有游标类型,要使用包来定义游标类型 cur_data out package_fenye.cursor_type, -- 返回总页数 v_count out number, -- 返回数据表中有多少条数据 v_mypages out number --返回总共分为多少页 ) is --定义变量 -- 存储sql语句 v_sql varchar2(300); -- 数据范围 v_begin number(10):=v_pagesize*(v_pagenow-1)+1; v_end number(10):=v_pagesize*v_pagenow; begin --定义查询数据的sql语句 --查询最外范围的 v_sql:= 'select * from (select rownum rn,a.* from (select * from '||v_tablename||')a)b where rn>='||v_begin||' and rn<='||v_end; --使用游标存储数据 -- 拿到总数据 open cur_data for v_sql; v_sql:='select count(*) from '||v_tablename; --执行sql语句,返回结果 --拿到总数据条数 execute immediate v_sql into v_count; -- 获得总页数 if mod(v_count,v_pagesize)= 0 then --计算总页数 v_mypages:=v_count/v_pagesize; else v_mypages:=v_count/v_pagesize+1; end if; end;