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