zoukankan      html  css  js  c++  java
  • Oracle数据库使用存储过程实现分页

    注:本示例来源于韩顺平[10天玩转oracle数据库]视频教程

    1、创建包同时创建游标

    create or replace package pagingPackage is
      type paging_cursor is ref cursor;
    end;
    /

    2、创建分页存储过程

    create or replace procedure paging_cursor
    (
        v_in_table in varchar2,
        v_in_pagesize in number,
        v_in_pagenow in number,
        v_out_result out pagingPackage.paging_cursor,
        v_out_rows out number,
        v_out_pagecount out number
    ) is
        --定义需要的变量
        v_sql varchar2(4000);
        v_sql_select varchar2(4000);
        v_start number;
        v_end number;
    begin
        --计算v_start和v_end是多少
        v_start:=v_in_pagesize*(v_in_pagenow-1)+1;
        v_end:=v_in_pagesize*v_in_pagenow;
        v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start;
        
        --打开游标,让游标指向结果集
        open v_out_result for v_sql;
        
        --查询共有多少条记录
        v_sql_select:='select count(*) from '||v_in_table;
        execute immediate v_sql_select into v_out_rows;
       
        --统计多少页记录
        if mod(v_out_rows,v_in_pagesize)=0 then
            v_out_pagecount:=v_out_rows/v_in_pagesize;
        else
            v_out_pagecount:=v_out_rows/v_in_pagesize+1;
        end if;
        
        --关闭游标
        close v_out_result;
    end;
    /

    3、java调用分页存储过程(完整)源代码

    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    
    public class TestProcedurePaging {
        // 调用oracle分页存储过程并获得存储过程的返回结果集。
        public static void main(String[] args) {
            // 定义需要的变量
            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:orcl", "scott", "tiger");
    
                // 创建CallableStatement接口
                cs = ct.prepareCall("{call paging_cursor(?,?,?,?,?,?)}");
    
                // 给in?赋值
                cs.setString(1, "emp");// 传表名
                cs.setInt(2, 6);// 传入pagesize,每页显示多少条记录
                cs.setInt(3, 1);// 传入pagenow,显示第几页。
                // 给out?注册
                cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
                cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
                cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER);
    
                // 执行
                cs.execute();
    
                // 这里是关键所在,java没有接收结果集的get方法,所以只能用getObject来接收结果集,接收到后需要使用ResultSet强转才可以
                rs = (ResultSet) cs.getObject(4);
                // 循环取出
                while (rs.next()) {
                    System.out.println(rs.getString("ename") + " " + rs.getString("sal"));
                }
                // 取出总记录数
                int rowCount = cs.getInt(5);
                // 取出总页数
                int pageCount = cs.getInt(6);
    
                System.out.println("共有记录:" + rowCount + "条!   " + "共有记录:" + pageCount + "页!");
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭资源
                try {
                    if (cs != null) {
                        cs.close();
                    }
                    if (rs != null) {
                        rs.close();
                    }
                    if (ct != null) {
                        ct.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                cs = null;
                rs = null;
                ct = null;
            }
        }
    }
  • 相关阅读:

    Elaxia的路线
    Sessions in BSU
    Mouse Hunt
    清北学堂 NOIP2017模拟赛 越赛越心塞
    BZOJ3571 HNOI2014 画框
    BZOJ4817 SDOI2017 相关分析
    BZOJ4009 HNOI2015 接水果
    CDQ分治与整体二分小结
    BZOJ3110 ZJOI2013 K大数查询
  • 原文地址:https://www.cnblogs.com/zj0208/p/6076471.html
Copyright © 2011-2022 走看看