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

 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

 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 

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         }