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

 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         }
posted on 2007-06-10 18:36  PetterLiu  阅读(1643)  评论(7编辑  收藏  举报