oracle的存储过程实现数据分页

转载 2012年08月04日 17:22:57

因为oracle 中的存储过程无法像SQLServer的存储过程直接返回结果集,所以要返回结果集就得使用引用游标,
首先定义一个包,在包中定义一个引用游标。

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



创建实现分页的存储过程:

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,     --总页数 www@bitscn@com
        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;

相关文章推荐

Oracle大数据量分页通用存储过程

type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集 /**********************************************...

CYQ.Data 数据框架 数据库分页方式及存储过程[SQL2000/SQL2005/Oracle]

在 CYQ.Data 分页是内部集成的功能,针对不同的数据库,使用不同的分页形式。   1:Access   :集成:使用3次Top分页2:MySql    :集成,使用Limit N分页3:...
  • cyq1162
  • cyq1162
  • 2016年11月23日 12:12
  • 189

Oracle利用存储过程性 实现分页

分页的简单配置 在上一次已经说过了 这边说说怎么在存储过程中实现分页 首先建立存储过程 参考 http://www.cnblogs.com/gisdream/archive/2011/11/...

在Oracle存储过程中正确的实现分页

在Oracle存储过程中正确的实现分页在实际中的应用比例还是占为多数的,如果你对这一相关技术,心存好奇的话,以下的文章将会给你提供Oracle存储过程中正确的实现分页的好用的操作方案。   几乎每一...
  • vipyhd
  • vipyhd
  • 2012年07月17日 19:30
  • 328

Oracle之存储过程实现分页

存储过程如下:
  • QUAN_IT
  • QUAN_IT
  • 2014年08月17日 15:39
  • 470

在Oracle存储过程中实现分页

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

oracle存储过程实现分页

--book表 CREATE TABLE book( book_id VARCHAR2(20), book_name VARCHAR2(100), book_publish VARCHAR2(...
  • leeket
  • leeket
  • 2011年11月07日 22:04
  • 269

c#+oracle存储过程实现分页

1、在oracle的sqlplus或其他工具中运行一下pl/sql块建立存储过程 ----------------------------------------------------------...
  • ty_soft
  • ty_soft
  • 2012年01月04日 11:25
  • 144

ORACLE分页存储过程

  • 2014年06月11日 11:33
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle的存储过程实现数据分页
举报原因:
原因补充:

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