第一步:建一个含游标类型的包
sql>create or replace package testPackage
as type test_cursor is ref cursor; --定义名为test_cursor 的游标
end testPackage;
第二步:编写分页的存储过程
sql>create or replace procedure fenYe(
tableName in varchar2,--表名
pageSize in number,--每页显示的记录数
pageNow in number,--当前页
myRows out number,--总记录数
myPageCount out number,--总页数
P_cursor out testPackage.test_cursor--返回的记录集
) is
--定义部分 sql语句字符串,以及两个变量
v_sql varchar(1000);
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageSize*pageNow;
--执行部分
begin
v_sql:=‘select * from (select a1.*,rownum rn from (select * from ‘||tableName||‘) a1 where
rownum<=‘||v_end||‘) where rn>=‘||v_begin;
open P_cursor for v_sql; --游标关联sql
v_sql:=‘select count (*) from ‘||tableName;
execute immediate v_sql into myRows;
if mod(myRows,pageSize)=0 then
myPageCount:=myRows/pageSize;
else
myPageCount:=myRows/pageSize+1;
end if;
close P_cursor;
end;
/
第三步 java调用该过程 记得引进jar 包
import java.sql.*;
public class fenYe {
public static void main(String [] args){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger"); // ORCL 位数据库名
CallableStatement cs=ct.prepareCall("{call fenYe(?,?,?,?,?,?)}");
//给?赋值
cs.setString(1,"emp");
cs.setInt(2,5);//每页显示5行
cs.setInt(3,2);// 显示第二页
// 注册返回值
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();//执行
int rowNum=cs.getInt(4);
int pageCount=cs.getInt(5);
ResultSet 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));}
}catch(Exception e){
e.printStackTrace();}
}
}