综合练习:分页的存储过程
-- 联系,创建分页的存储过程
--1.声明一个引用游标
create or replace package cur_ref_type
as -- is or as can be used
type cur_ref is ref cursor;
end;
-- 2.写存储过程
create or replace procedure divideByPge
(tableName varchar2,pageSize number,currentPage number,
totalPage out number,totalRecord out number,results out cur_ref_type.cur_ref)-- 要带包名
is
v_sql varchar2(200); -- 用于写sql语句的
v_begin number; -- 开始位置
v_end number; -- 结束位置
begin
v_begin := (currentPage - 1) * pageSize;
v_end := currentPage * pageSize;
v_sql := 'select count(*) from '||tableName; -- 将表名字符串拼接sql语句
execute immediate v_sql into totalRecord; --查询所有记录
totalPage := ceil(totalRecord/pageSize); -- 计算总页数
v_sql := 'select * from (select rownum rn,'||tableName||'.* from '||tableName||' where rownum <= '||v_end||') where rn > '||v_begin;
open results for v_sql;
end;
Java客户端调用
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "ysjian";
try {
Class.forName(driver);
Connection conn =
DriverManager.getConnection(url,username,password);
CallableStatement cs = conn.prepareCall("{call
divideByPge(?,?,?,?,?,?)}");
cs.setString(1, "emp"); //表名
cs.setInt(2, 3);// 分页单位
cs.setInt(3, 1); //当前页
cs.registerOutParameter(4, OracleTypes.INTEGER); //注册输出参数
cs.registerOutParameter(5, OracleTypes.INTEGER);
cs.registerOutParameter(6, OracleTypes.CURSOR); //注册输出参数游标
cs.execute(); //执行
ResultSet rs = (ResultSet)cs.getObject(6); //获得游标
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
System.out.println(empno+"-->"+ename);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}