根据网上流传的版本,修改而成,加入了新的重载。包定义如下:
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 }