如何在Oracle存储过程中实现分页

原创 2007年09月19日 17:47:00
几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。

         之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,只需要修改存储过程的代码。但这个例子是在存储过程里动态生成的SQL语句,不知道会不会因此失去存储过程一次编译和快速的特点。代码如下:

1、首先建立一个包,用户创建一个游标类型

create or replace package pkg_query as
  type cur_query is ref cursor;
end pkg_query;

2、创建存储过程

CREATE OR REPLACE PROCEDURE prc_query
       (p_tableName        in  varchar2,   --表名
        p_strWhere         in  varchar2,   --查询条件
        p_orderColumn      in  varchar2,   --排序的列
        p_orderStyle       in  varchar2,   --排序方式
        p_curPage          in out Number,  --当前页
        p_pageSize         in out Number,  --每页显示记录条数
        p_totalRecords     out Number,     --总记录数
        p_totalPages       out Number,     --总页数
        v_cur              out pkg_query.cur_query)   --返回的结果集
IS
   v_sql VARCHAR2(1000) := '';      --sql语句
   v_startRecord Number(4);         --开始显示的记录条数
   v_endRecord Number(4);           --结束显示的记录条数
BEGIN
   --记录中总记录条数
   v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || p_strWhere;
   END IF;
   EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
  
   --验证页面记录大小
   IF p_pageSize < 0 THEN
       p_pageSize := 0;
   END IF;
  
   --根据页大小计算总页数
   IF MOD(p_totalRecords,p_pageSize) = 0 THEN
       p_totalPages := p_totalRecords / p_pageSize;
   ELSE
       p_totalPages := p_totalRecords / p_pageSize + 1;
   END IF;
  
   --验证页号
   IF p_curPage < 1 THEN
       p_curPage := 1;
   END IF;
   IF p_curPage > p_totalPages THEN
       p_curPage := p_totalPages;
   END IF;
  
   --实现分页查询
   v_startRecord := (p_curPage - 1) * p_pageSize + 1;
   v_endRecord := p_curPage * p_pageSize;
   v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
            '(SELECT * FROM ' || p_tableName;
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
   END IF;
   IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
       v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
   END IF;
   v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
            || v_startRecord;
   DBMS_OUTPUT.put_line(v_sql);
   OPEN v_cur FOR v_sql;
END prc_query;

3、JAVA代码里取出结果集

String sql= "{ call prc_query(?,?,?,?,?,?,?,?,?) }";
CallableStatement call = con.prepareCall(sql);

// ……中间数据设置及注册省略

call.registerOutParameter(9, OracleTypes.CURSOR);

// 取出结果集

(ResultSet) call.getObject(9);

 

如何在Oracle存储过程中实现分页

 几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。         之所以用存...
  • Rebirth_moring
  • Rebirth_moring
  • 2007年08月13日 16:28
  • 524

Oracle使用存储过程分页

今天我要说的就是基于Oracle存储过程的一种简单的分页方式,首先就是页面前端发起对分页的请求,然后向Oracle存储过程中传入页面当前数,页面大小,查询的SQL语句,而存储过程返回来的则是数据总条数...
  • lingyiwin
  • lingyiwin
  • 2016年04月26日 17:31
  • 1662

用java实现的通用内存分页函数

用java实现的通用内存分页函数
  • netyeaxi
  • netyeaxi
  • 2017年12月21日 18:05
  • 95

Dreamweaver 分页修改

导读:   估计很多初学ASP的朋友开始利用Dreamweaver强大的组件功能写出自己的需要的程序,可惜,程序毕竟是程序,永远也没人转的快。所以当有了比较变态的需求后,问题就来了,好了,废话少说,...
  • chief1985
  • chief1985
  • 2008年01月16日 14:12
  • 1419

存储过程分页查询(ORACLE)

CREATE OR REPLACE PACKAGE PKG_QUERY_PAGEDATA IS   -- 存储过程分页查询包.   -- 原创  : 三界.   -- CREATED : 20...
  • QQ56430204
  • QQ56430204
  • 2016年12月15日 12:00
  • 725

javaweb实现简单分页基本步骤分析

我们以图书部分网站为例 第一步:PageServlet的设计           ①String category = request.getParameter("category");//获取图书类...
  • weixin_37860082
  • weixin_37860082
  • 2018年01月02日 15:54
  • 81

【Web】分页简单实现

web分页   为什么需要分页? 一、数据方面的原因 大量查询的数据耗时比较严重。 二、增强用户使用体验需求 用户更方便的查询和展示他所需要的数据。   常见分页方式:传统分页方式和下...
  • u010583599
  • u010583599
  • 2017年02月09日 15:11
  • 3059

如何做系列(1)- mybatis 如何实现分页?

mybatis 如何实现分页?   第一个做法,就是直接使用我们的sql语句进行分页,也就是在mapper里面加上分页的语句就好了。 Select ROWNUM,ID,NAME FROM(...
  • MrCharles
  • MrCharles
  • 2016年07月14日 19:22
  • 2109

DWZ 分页实现 后台前端框架

分页思路服务器返回当前页的数据,总条数,再由js来生成分页标签。分页是配合服务器端来处理的, 不是存js做的分页。 因为如果数据量很大,比如有好几百页,性能很慢。...
  • Jerome_s
  • Jerome_s
  • 2015年05月08日 19:46
  • 3144

Servlet——实现数据分页显示

本文讲述了Servlet中连接数据库以及实现数据分页显示的方法。
  • ggGavin
  • ggGavin
  • 2016年05月06日 22:39
  • 7101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Oracle存储过程中实现分页
举报原因:
原因补充:

(最多只允许输入30个字)