import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestPage { public TestPage() { } public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@localhost:1521:xmgl"; String username = "xmgl"; String password = "xmgl"; Statement stmt = null; ResultSet rs = null; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(strUrl, username, password); System.out.println("ok"); CallableStatement cs = null; //创建CallableStatement cs = conn.prepareCall("{call page.fenye(?,?,?,?,?,?)}"); cs.setString(1, "mytest");//表名 cs.setInt(2, 3);//显示几条记录 cs.setInt(3, 1);//第几页 //注册总记录数,声明输出参数是什么类型的 cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER); //注册总页数 cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER); //注册返回的结果集 cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR); cs.execute(); //取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的 int rowNum=cs.getInt(4);//获得输出参数 int pageCount = cs.getInt(5); rs=(ResultSet)cs.getObject(6); System.out.println("rowNum="+rowNum); System.out.println("总页数="+pageCount); while (rs.next()) { System.out.println("编号:"+rs.getInt(1)+" 名字:"+rs.getString(2)+" 密码:"+rs.getString(3)); } } catch (SQLException ex2) { ex2.printStackTrace(); } catch (Exception ex2) { ex2.printStackTrace(); } finally { try { if (rs != null) { rs.close(); if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } } catch (SQLException ex1) { } } } } 存储语句: create or replace package page is type test_cursor is ref cursor; procedure fenye(tableName in varchar2,pageSize in number,pageNow in number,myRows out number,myPageCount out number,p_cursor out page.test_cursor); end; create or replace package body page is procedure fenye( tableName in varchar2, pageSize in number,--一页显示记录数 pageNow in number,--第几页 myRows out number,--总记录数 myPageCount out number,--总页数 p_cursor out page.test_cursor--返回的记录集 ) is --定义部分 --定义sql 语句 字符串 v_sql varchar2(1000); --定义两个整数 v_begin number:=(pageNow-1)*pageSize+1; v_end number:=pageNow*pageSize; begin --执行部分 v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin||' order by userid asc '; --把游标和sql 关联 open p_cursor for v_sql; --计算myRows 和myPageCount --组织一个sql 语句 v_sql:='select count(*) from '||tableName; --执行sql,并把返回的值,赋给myRows; execute immediate v_sql into myRows; --计算myPageCount --if myrows%Pagesize=0 then 这样写是错的 if mod(myRows,pageSize)=0 then myPageCount:=myrows/pageSize; else myPageCount:=myrows/pageSize+1; end if; --关闭游标 --close p_cursor; end; end;