存储过程代码:
--1创建一个包,在该包中,定义类型 test_cursor ,是个游标
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--开始编写分页的过程
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 varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*pagesize+1; --现在 (emp , 3,1,x,x,x)
v_end number:=pageNow*pagesize;
begin
--执行部分
--下面我们拼接分页查询语句.
v_sql:='select * from (select t1.*,rownum rn from (select * from '|| tableName
||' order by ename) t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和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 mod(myrows,pagesize)=0 then --比如myrows=10 pagesize=2
myPageCount:=myrows/pagesize;
else
myPageCount:=myrows/pagesize+1;--比如myrows=10 pagesize=3
end if;
--关闭游标(如果返回给java程序用,则不能关闭p_cursor)
--close p_cursor;
end;
--------------------------------------------------------------------------
Java调用过程代码:
public class IliyaPro {
public static void main(String[] args) throws Exception {
Connection ct = null;
CallableStatement cs = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct = DriverManager
.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:iliya",
"scott", "tiger");
cs=ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
//表名
cs.setString(1, "emp");
//每页显示的行数(记录数)
cs.setInt(2, 7);
//第几页
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();
// 得到结果,结果集存在游标里面
rs = (ResultSet) cs.getObject(6);
while (rs.next()) {
System.out.println("名字:" + rs.getString(2));
}
System.out.println("总记录数为" + cs.getInt(4));
System.out.println("总页数为:" + cs.getInt(5));
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
} finally {
// 关闭资源..
if (rs != null) {
rs.close();
}
if (cs != null) {
cs.close();
}
if (ct != null) {
ct.close();
}
}
}
}