分页调用存储过程:
要求
编写一个存储过程,要求可以输入表名,每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集
emp表结构如下:
- 创建包,在该包中,定义类型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;
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调用分页存储过程
说明:
结果集循环体中:
rs.getInt(1) 是因为emp表中,第一个字段类型为int,同理,员工姓名为第2个字段
public class TestPageration {
public static void main(String[] args) {
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获得数据库连接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@XXXXX");
//创建CallableStatement
CallableStatement callableStatement = connection.prepareCall("{call fenye(?,?,?,?,?,?)}");
//给?赋值
callableStatement.setString(1,"emp");
callableStatement.setInt(2,5);
callableStatement.setInt(3,1);
//总条数
callableStatement.registerOutParameter(4, OracleTypes.INTEGER);
//总页数
callableStatement.registerOutParameter(5, OracleTypes.INTEGER);
//结果集
callableStatement.registerOutParameter(6, OracleTypes.CURSOR);
//执行
callableStatement.execute();
int rownum = callableStatement.getInt(4);
int pageCount = callableStatement.getInt(5);
//得到结果集
ResultSet rs = (ResultSet) callableStatement.getObject(6);
while (rs.next()){
System.out.println("员工编号:"+rs.getInt(1)+"员工姓名:"+rs.getString(2));
}
callableStatement.close();
connection.close();
}catch (Exception e){
e.printStackTrace();
}
}
}