oracle存储过程分页与返回多结果集

plsql代码:



SQL> create or replace package testpackage as --创建包用来放游标
2 type test_cursor is ref cursor; --定义的游标test_cursor,ref curosr用法还不是很熟
3 end testpackage;
4 /

Package created



SQL> create or replace procedure fenye(
2 v_tablename in varchar2, --输入的表名,根据不同的表来分页
3 v_pagenow in number, --分页时当前页码
4 v_pagesize in number, --每页的页数
5 v_mypagecount out number, --计算出一共多少页
6 v_myrows out number, --计算表中一共多少行
7 p_cursor out testpackage.test_cursor --要输出的游标
8 )
9 is
10 v_sql varchar2(1000);
11 v_begin number:=(v_pagenow-1)*v_pagesize+1; --计算初始页,既从哪页开始
12 v_end number:=v_pagenow*v_pagesize; --计算结束页,既从哪页结束


13 begin --
14 v_sql:='select *
15 from (select b.*,
16 rownum as rn
17 from (select *
18 from '||v_tablename||'
19 order by sal desc) b
20 where rownum<='||v_end||')
21 where rn>='||v_begin;


22 open p_cursor for v_sql;


23 v_sql:='select count(*) from '||v_tablename;
24 execute immediate v_sql into v_myrows;


25 if mod(v_myrows,v_pagesize)=0 then
26 v_mypagecount:=v_myrows/v_pagesize;
27 else
28 v_mypagecount:=v_myrows/v_pagesize+1;
29 end if;


30 --- close p_cursor; //注间不要关闭游标 否则程序读不到数据
31 end;
32 /

Procedure created



java代码:



import java.sql.*;



public class TestProcedure
{
public static void main(String args[]){
try{

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:MYORACLE","SCOTT","TIGER");


CallableStatement call=con.prepareCall("{call fenye(?,?,?,?,?,?)}");--分页过程的6个参数


call.setString(1,"emp");
call.setInt(2,3);
call.setInt(3,2);


call.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
call.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
call.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);--输出的游标


call.execute();


int rowNum=call.getInt(4);
int pageCount=call.getInt(5);


//System.out.println("rowNum:"+rowNum);
//System.out.println("pageCount:"+pageCount);


ResultSet rs=(ResultSet) ((OracleCallableStatement)call).getObject(6); --提示有错误






while(rs.next()){
System.out.println("编号:"+rs.getInt(1)+" "+"名字:"+rs.getString(2));
}
rs.close();
con.close();
call.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值