设为首页 收藏本站
查看: 2713|回复: 0

[经验分享] Oracle 分页存储过程

[复制链接]

尚未签到

发表于 2018-9-26 06:13:06 | 显示全部楼层 |阅读模式
  分页存储过程:入参为基本的sql语句、分页大小、当前页,出参为总记录数、总页数、查询结果集。
  


  • --分页存储过程
  • create or replace procedure paging
  • (baseSql     in  varchar2,     --基本的sql语句
  • pageSize    in  number,       --分页大小
  • pageCurrent in  number,       --当前页
  • rowCount    out number,       --总记录数
  • pageCount   out number,       --总页数
  • p_cursor    out p_paging.paging_cur --返回的结果集
  • ) is
  • --定义部分
  • --定义sql语句,字符串变量
  • v_sql varchar2(1000);
  • --查询起始值
  • v_begin number := (pageCurrent - 1) * pageSize + 1;
  • --查询结束值
  • v_end number   :=  pageCurrent * pageSize;
  • begin
  • --执行部分
  • v_sql := 'select * from
  •   (select t.*,rownum rn from ('||baseSql||')t where rownum = '||v_begin;
  • --把游标和sql关联
  • open p_cursor for v_sql;
  • --重新赋值v_sql,计算总记录数
  • v_sql := 'select count(1) from ('||baseSql||')';
  • --执行sql语句,把返回值赋给rowCount
  • execute immediate v_sql into rowCount;
  • --计算总页数
  • if mod(rowCount,pageSize) = 0 then
  •     pageCount := rowCount/pageSize;
  • else
  •     pageCount := rowCount/pageSize + 1;
  • end if;
  • --close p_cursor;
  • end;
  

  辅助的包package:
  


  • --创建一个包,定义一个游标类型
  • create or replace package p_paging as
  •   --游标参照变量
  •   type paging_cur is ref cursor;
  • end p_paging;
  

  测试分页存储过程的java类:
  


  • public class TestPagingProcedure
  • {

  •     /**
  •      * Discription:[测试分页存储过程]
  •      * @param args
  •      * @author:[LJ]
  •      * @update:[2012-4-4] [LJ][创建]
  •      */

  •     public static void main(String[] args)
  •     {
  •         Connection conn = null;
  •         CallableStatement cs = null;
  •         ResultSet rs = null;
  •         String sql = "select * from emp";//查询sql语句
  •         int pageSize = 5;//分页大小
  •         int pageCurrent = 1;//当前页
  •         try
  •         {
  •             Class.forName("oracle.jdbc.driver.OracleDriver");
  •             conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
  •             //调用存储过程
  •             cs = conn.prepareCall("{call paging(?,?,?,?,?,?)}");
  •             //设置sql语句
  •             cs.setString(1, sql);
  •             //设置分页大小
  •             cs.setInt(2, pageSize);
  •             //设置当前页
  •             cs.setInt(3, pageCurrent);
  •             //注册总记录数
  •             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 rowNum = cs.getInt(4);
  •             int pageCount = cs.getInt(5);

  •             //取出结果集
  •             rs = (ResultSet)cs.getObject(6);

  •             //显示总记录数和总页数
  •             System.out.println("rowNum = " + rowNum);
  •             System.out.println("pageCount = " + pageCount);
  •             //遍历结果集
  •             while(rs.next())
  •             {
  •                 System.out.println("员工编号:"+rs.getInt("empno")+" 名字:"+rs.getString("ename"));
  •             }
  •         }
  •         catch (Exception e)
  •         {
  •             System.out.println("查询失败!");
  •         }
  •         finally
  •         {
  •             try
  •             {
  •                 if(rs!=null)
  •                 {
  •                     rs.close();
  •                 }
  •                 if(cs!=null)
  •                 {
  •                     cs.close();
  •                 }
  •                 if(conn!=null)
  •                 {
  •                     conn.close();
  •                 }
  •             }
  •             catch (SQLException e)
  •             {
  •                 System.out.println("关闭失败!");
  •             }
  •         }
  •     }
  • }
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602064-1-1.html 上篇帖子: Oracle 不能启动两例 下篇帖子: ORA-01033:ORACLE initialization or shutdown in progress
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表