问题:编写一个存储过程,要求可以输入表名,每页显示记录数,当前页,返回总记录数,总页数,和返回的结果集
--开始编写分页的过程
--首先创建一个包
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;
v_end number := PageNow*Pagesize;
begin
--执行部分
v_sql:='select * from(select t1.*,rownum rn from (select * from '|| tableName ||' order by sal) 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
myPageCount := myrows/Pagesize;
else
myPageCount := myrows/Pagesize+1;
end if;
--关闭游标
--close p_cursor;
end;
--使用java测试
package com.sw;
import java.sql.*;
/*
* oracle实现分页
*/
public class Test5 {
public static void main(String[] args) {
try {
//声明驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到链接
Connection conn = DriverManager
.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl",
"scott","Oracle1");
//创建CallableStatement
CallableStatement cs = conn.prepareCall("{call fenye(?,?,?,?,?,?)}");
//给?赋值
cs.setString(1, "emp");
cs.setInt(2,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();
//取出数值或结果集,getInt(4)中的4是由参数的位置决定的
//取出总记录数
int rowCount = cs.getInt(4);
//取出总页数
int pageCount = cs.getInt(5);
//取出结果集
ResultSet rs = (ResultSet)cs.getObject(6);
//显示结果
System.out.println("总记录数:"+rowCount+" "+"总页数: "+pageCount);
while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getFloat(6));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}