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(); } }}我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html