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;