java调用oracle分页存储过程

分页调用存储过程:

要求

编写一个存储过程,要求可以输入表名,每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集
emp表结构如下:

emp表结构

  1. 创建包,在该包中,定义类型test_cursor,是个游标
create or replace package testpackage as 
type test_cursor is ref cursor;
end testpackage;
  1. 创建存储过程
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;
/
  1. 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();
        }
    }
}

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...