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;