Oracle通用分页包

      根据网上流传的版本,修改而成,加入了新的重载。包定义如下:

 1  /* ****************************************************************
 2   *功能描述: 大数据量分页通用存储过程包定义
 3   *创建人:   Melodicsoul    
 4   *创建时间: 2007-05-28
 5   **************************************************************** */
 6  create   or   replace  package p_page  is
 7  type refCursorType  is  REF  CURSOR ;   -- 游标类型定义,用于返回数据集
 8  procedure  sp_Page(p_PageSize  int ,           -- 每页记录数
 9                    p_PageNo  int ,             -- 当前页码,从 1 开始
10                    p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
11                    p_OutRecordCount out  int , -- 返回总记录数
12                    p_OutCursor out refCursorType);
13  procedure  sp_Page(p_PageSize  int ,           -- 每页记录数
14                    p_PageNo  int ,             -- 当前页码,从 1 开始
15                    p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
16                    p_SqlCount  varchar2 ,      -- 获取记录总数的查询语句
17                    p_OutRecordCount out  int , -- 返回总记录数
18                    p_OutCursor out refCursorType);
19  procedure  sp_Page(p_PageSize  int ,         -- 每页记录数
20                    p_PageNo  int ,           -- 当前页码,从 1 开始
21                    p_SqlSelect  varchar2 ,   -- 查询语句,含排序部分
22                    p_OutCursor out refCursorType);
23  procedure  sp_Page(p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
24                    p_OutRecordCount out  int );  -- 返回总记录数
25  end  p_page;
    包主体:
  1  CREATE   OR   REPLACE  PACKAGE BODY p_page  as
  2  procedure  sp_Page(p_PageSize  int ,           -- 每页记录数
  3                    p_PageNo  int ,             -- 当前页码,从 1 开始
  4                    p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
  5                    p_OutRecordCount out  int , -- 返回总记录数
  6                    p_OutCursor out refCursorType)
  7  as
  8      v_sql  varchar2 ( 3000 );
  9      v_count  int ;
 10      v_heiRownum  int ;
 11      v_lowRownum  int ;
 12  begin
 13     -- --取记录总数
 14    v_sql : =   ' select count(*) from ( '   ||  p_SqlSelect  ||   ' ) ' ;
 15     execute  immediate v_sql  into  v_count;
 16    p_OutRecordCount : =  v_count;
 17     -- --执行分页查询
 18    v_heiRownum : =  p_PageNo  *  p_PageSize;
 19    v_lowRownum : =  v_heiRownum  -  p_PageSize  +   1 ;
 20 
 21    v_sql : =   ' SELECT *
 22              FROM (
 23                    SELECT A.*, rownum rn
 24                    FROM  ( ' ||  p_SqlSelect  || ' ) A
 25                    WHERE rownum <=  ' ||  to_char(v_heiRownum)  ||   '
 26                   ) B
 27              WHERE rn >=  '   ||  to_char(v_lowRownum) ;
 28               -- 注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 29 
 30     OPEN  p_OutCursor  FOR   v_sql;
 31 
 32  end  sp_Page;
 33 
 34  /* ****************************************************************
 35   *功能描述: 大数据量分页通用存储过程(重载1,推荐使用)
 36   *创建人:   Melodicsoul    
 37   *创建时间: 2007-05-28
 38   **************************************************************** */
 39  procedure  sp_Page(p_PageSize  int ,           -- 每页记录数
 40                    p_PageNo  int ,             -- 当前页码,从 1 开始
 41                    p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
 42                    p_SqlCount  varchar2 ,      -- 获取记录总数的查询语句
 43                    p_OutRecordCount out  int , -- 返回总记录数
 44                    p_OutCursor out refCursorType)
 45  as
 46      v_sql  varchar2 ( 3000 );
 47      v_count  int ;
 48      v_heiRownum  int ;
 49      v_lowRownum  int ;
 50  begin
 51     -- --取记录总数
 52     execute  immediate p_SqlCount  into  v_count;
 53    p_OutRecordCount : =  v_count;
 54     -- --执行分页查询
 55    v_heiRownum : =  p_PageNo  *  p_PageSize;
 56    v_lowRownum : =  v_heiRownum  -  p_PageSize  +   1 ;
 57 
 58    v_sql : =   ' SELECT *
 59              FROM (
 60                    SELECT A.*, rownum rn
 61                    FROM  ( ' ||  p_SqlSelect  || ' ) A
 62                    WHERE rownum <=  ' ||  to_char(v_heiRownum)  ||   '
 63                   ) B
 64              WHERE rn >=  '   ||  to_char(v_lowRownum) ;
 65               -- 注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
 66 
 67     OPEN  p_OutCursor  FOR   v_sql;
 68 
 69  end  sp_Page;
 70 
 71  /* ****************************************************************
 72   *功能描述: 大数据量分页通用存储过程(重载2)
 73   *创建人:   Melodicsoul    
 74   *创建时间: 2007-05-28
 75   **************************************************************** */
 76  procedure  sp_Page(p_PageSize  int ,         -- 每页记录数
 77                    p_PageNo  int ,           -- 当前页码,从 1 开始
 78                    p_SqlSelect  varchar2 ,   -- 查询语句,含排序部分
 79                    p_OutCursor out refCursorType)
 80  as
 81      v_sql  varchar2 ( 3000 );
 82       -- v_count int;
 83      v_heiRownum  int ;
 84      v_lowRownum  int ;
 85  begin
 86  /*
 87    ----取记录总数
 88    v_sql := 'select count(*) from (' || p_SqlSelect || ')';
 89    execute immediate v_sql into v_count;
 90    p_OutRecordCount := v_count;
 91  */
 92     -- --执行分页查询
 93    v_heiRownum : =  p_PageNo  *  p_PageSize;
 94    v_lowRownum : =  v_heiRownum  -  p_PageSize  +   1 ;
 95 
 96    v_sql : =   ' SELECT *
 97              FROM (
 98                    SELECT A.*, rownum rn
 99                    FROM  ( ' ||  p_SqlSelect  || ' ) A
100                    WHERE rownum <=  ' ||  to_char(v_heiRownum)  ||   '
101                   ) B
102              WHERE rn >=  '   ||  to_char(v_lowRownum) ;
103               -- 注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
104 
105     OPEN  p_OutCursor  FOR   v_sql;
106  end  sp_Page;
107  /* ****************************************************************
108   *功能描述: 大数据量分页通用存储过程(重载3)
109   *创建人:   Melodicsoul    
110   *创建时间: 2007-05-28
111   **************************************************************** */
112  procedure  sp_Page(p_SqlSelect  varchar2 ,     -- 查询语句,含排序部分
113                    p_OutRecordCount out  int ) -- 返回总记录数            
114  as
115      v_sql  varchar2 ( 3000 );
116      v_count  int ;
117  begin
118     -- --取记录总数
119    v_sql : =   ' select count(*) from ( '   ||  p_SqlSelect  ||   ' ) ' ;
120     execute  immediate v_sql  into  v_count;
121    p_OutRecordCount : =  v_count;
122  end  sp_Page;
123  end  p_page;
调用的C#代码(此处是EnterpriseLibrary3.0+AspnetPager):
 1           ///   <summary>
 2           ///  取总记录数 
 3           ///  创建人:   Melodicsoul( http://wintersun.cnblogs.com
 4           ///  创建时间: 2007-06-10
 5           ///   </summary>
 6           private   void  GetCount()
 7          {
 8              Database db  =  DatabaseFactory.CreateDatabase( " OracleConnection " );
 9               string  sqlCommand  =   " P_PAGE.sp_Page " ;
10              DbCommand dbCommand  =  db.GetStoredProcCommand(sqlCommand);
11              db.AddInParameter(dbCommand,  " p_SqlSelect " , DbType.String,  " sys_operator " );
12              db.AddOutParameter(dbCommand,  " p_OutRecordCount " , DbType.Int32,  4 );
13              db.ExecuteNonQuery(dbCommand);
14              Pager1.RecordCount  =  ( int )dbCommand.Parameters[ " p_OutRecordCount " ].Value;
15              BindData2();
16          }
17           ///   <summary>
18           ///  OracleDataBase 绑定数据
19           ///  创建人:   Melodicsoul ( http://wintersun.cnblogs.com )    
20           ///  创建时间: 2007-06-10
21           ///   </summary>
22           private   void  BindData2()
23          {
24              OracleDatabase db  =   new  OracleDatabase(System.Configuration.ConfigurationManager.ConnectionStrings[ " OracleConnection " ].ToString());
25               string  sqlCommand  =   " P_PAGE.sp_Page " ;
26              OracleCommand dbCommand  =  (OracleCommand)db.GetStoredProcCommand(sqlCommand);
27             
28              db.AddInParameter(dbCommand,  " p_PageSize " , DbType.Int32, Pager1.PageSize);
29              db.AddInParameter(dbCommand,  " p_PageNo " , DbType.Int32, Pager1.CurrentPageIndex);
30              db.AddInParameter(dbCommand,  " p_SqlSelect " , DbType.String,  " Select * from sys_operator " );
31 
32              dbCommand.Parameters.Add( " p_OutCursor " , OracleType.Cursor).Direction  =  ParameterDirection.Output;
33               this .GridView1.DataSource  =  db.ExecuteReader(dbCommand);
34               this .GridView1.DataBind();
35            
36          }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值