Oralce通用分页包

CREATE OR REPLACE package p_page is
 type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集
 procedure sp_Page(p_PageSize int,          --每页记录数
                   p_PageNo int,            --当前页码,从 1 开始
                   p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_OutRecordCount out int,--返回总记录数
                   p_OutCursor out refCursorType);
 procedure sp_Page(p_PageSize int,          --每页记录数
                   p_PageNo int,            --当前页码,从 1 开始
                   p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_SqlCount varchar2,     --获取记录总数的查询语句
                   p_OutRecordCount out int,--返回总记录数
                   p_OutCursor out refCursorType);
 procedure sp_Page(p_PageSize int,        --每页记录数
                   p_PageNo int,          --当前页码,从 1 开始
                   p_SqlSelect varchar2,  --查询语句,含排序部分
                   p_OutCursor out refCursorType);
 procedure sp_Page(p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_OutRecordCount out int); --返回总记录数
 end p_page;
/

CREATE OR REPLACE PACKAGE BODY p_page as
 procedure sp_Page(p_PageSize int,          --每页记录数
                   p_PageNo int,            --当前页码,从 1 开始
                   p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_OutRecordCount out int,--返回总记录数
                   p_OutCursor out refCursorType)
 as
     v_sql varchar2(3000);
     v_count int;
     v_heiRownum int;
     v_lowRownum int;
 begin
   ----取记录总数
   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
   execute immediate v_sql into v_count;
   p_OutRecordCount := v_count;
   ----执行分页查询
   v_heiRownum := p_PageNo * p_PageSize;
   v_lowRownum := v_heiRownum - p_PageSize + 1;
 
   v_sql := 'SELECT *
             FROM (
                   SELECT A.*, rownum rn
                   FROM  ('|| p_SqlSelect ||') A
                   WHERE rownum <= '|| to_char(v_heiRownum) || '
                  ) B
             WHERE rn >= ' || to_char(v_lowRownum) ;
             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
   OPEN p_OutCursor FOR  v_sql;
 
 end sp_Page;
 
 /*****************************************************************
  *功能描述: 大数据量分页通用存储过程(重载1,推荐使用)
  *创建人:   Melodicsoul   
  *创建时间: 2007-05-28
  *****************************************************************/
 procedure sp_Page(p_PageSize int,          --每页记录数
                   p_PageNo int,            --当前页码,从 1 开始
                   p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_SqlCount varchar2,     --获取记录总数的查询语句
                   p_OutRecordCount out int,--返回总记录数
                   p_OutCursor out refCursorType)
 as
     v_sql varchar2(3000);
     v_count int;
     v_heiRownum int;
     v_lowRownum int;
 begin
   ----取记录总数
   execute immediate p_SqlCount into v_count;
   p_OutRecordCount := v_count;
   ----执行分页查询
   v_heiRownum := p_PageNo * p_PageSize;
   v_lowRownum := v_heiRownum - p_PageSize + 1;
 
   v_sql := 'SELECT *
              FROM (
                   SELECT A.*, rownum rn
                   FROM  ('|| p_SqlSelect ||') A
                   WHERE rownum <= '|| to_char(v_heiRownum) || '
                  ) B
             WHERE rn >= ' || to_char(v_lowRownum) ;
             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
   OPEN p_OutCursor FOR  v_sql;
 
 end sp_Page;
 
 /*****************************************************************
  *功能描述: 大数据量分页通用存储过程(重载2)
  *创建人:   Melodicsoul   
  *创建时间: 2007-05-28
  *****************************************************************/
 procedure sp_Page(p_PageSize int,        --每页记录数
                   p_PageNo int,          --当前页码,从 1 开始
                   p_SqlSelect varchar2,  --查询语句,含排序部分
                   p_OutCursor out refCursorType)
 as
     v_sql varchar2(3000);
     --v_count int;
     v_heiRownum int;
     v_lowRownum int;
 begin
 /*
   ----取记录总数
   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
   execute immediate v_sql into v_count;
   p_OutRecordCount := v_count;
 */
   ----执行分页查询
   v_heiRownum := p_PageNo * p_PageSize;
   v_lowRownum := v_heiRownum - p_PageSize + 1;
 
   v_sql := 'SELECT *
             FROM (
                   SELECT A.*, rownum rn
                   FROM  ('|| p_SqlSelect ||') A
                   WHERE rownum <= '|| to_char(v_heiRownum) || '
                  ) B
             WHERE rn >= ' || to_char(v_lowRownum) ;
             --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 
   OPEN p_OutCursor FOR  v_sql;
 end sp_Page;
 /*****************************************************************
  *功能描述: 大数据量分页通用存储过程(重载3)
  *创建人:   Melodicsoul   
  *创建时间: 2007-05-28
  *****************************************************************/
 procedure sp_Page(p_SqlSelect varchar2,    --查询语句,含排序部分
                   p_OutRecordCount out int)--返回总记录数           
 as
     v_sql varchar2(3000);
     v_count int;
 begin
   ----取记录总数
   v_sql := 'select count(*) from (' || p_SqlSelect || ')';
   execute immediate v_sql into v_count;
   p_OutRecordCount := v_count;
 end sp_Page;
 end p_page;
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值