C#调用代码:
[Test]
public void Page1Test()
{
using(Database db = DBFactory.Create())
{
const string sql = " select * from test_temp where ID < 1000 order by id asc ";
OracleCommand cmd = new OracleCommand("PAGESPLIT_PKG.PAGESPLIT_SP",db.Connection);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter p1 = new OracleParameter("pagesize", OracleDbType.Int32);
p1.Direction = ParameterDirection.Input;
p1.Value = 20;
OracleParameter p2 = new OracleParameter("pageindex", OracleDbType.Int32);
p2.Direction = ParameterDirection.Input;
p2.Value = 2;
OracleParameter p3 = new OracleParameter("sqltext", OracleDbType.Varchar2);
p3.Direction = ParameterDirection.Input;
p3.Value = sql;
OracleParameter p4 = new OracleParameter("Records_out", OracleDbType.Int32,DBNull.Value,ParameterDirection.Output); //就算是空值也要写,否则是会出错的
OracleParameter p5 = new OracleParameter("table_out", OracleDbType.RefCursor,DBNull.Value, ParameterDirection.Output);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
cmd.Parameters.Add(p5);
OracleDataAdapter da = new OracleDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
Console.WriteLine(ds.Tables.Count);
Console.WriteLine(ds.Tables[0].TableName);
Console.WriteLine(ds.Tables[0].Rows.Count);
Console.WriteLine("结果:" + cmd.Parameters["Records_out"].Value.ToString());
foreach(DataRow row in ds.Tables[0].Rows)
{
Console.WriteLine(row[1]);
}
}
}
Oracle里分页包代码如下:
1 create or replace package PageSplit_PKG as
2 -----------------------------------------------------------------------
3 -- 分页模块PageSplitPackage4Oracle V0.01
4 -- Author : zhouyu Eamil:atwind@cszi.com
5 -- 2009-11-4
6 -----------------------------------------------------------------------/
7
8 type DataTable is REF CURSOR; --游标类型定义,用于返回数据集
9
10 procedure PageSplit_SP(PageSize int,PageIndex int,SqlText string,Records_out out int,Table_out out DataTable); --申明包里的SP1
11
12 procedure PageSplit_SP(PageSize int,PageIndex int,SqlText string,Records_out out int,Pages_out out int,Table_out out DataTable); --申明包里的SP2
13
14 procedure PageSplit_SP(PageSize int,PageIndex int,SqlText string,SqlTextCount string,Records_out out int,Table_out out DataTable); --申明包里的SP3
15
16 procedure PageSplit_SP(PageSize int,PageIndex int,SqlText string,Table_out out DataTable); --申明包里的SP3
17
18 18end;
19
20 create or replace package body PageSplit_PKG as
21
22 -- 以下方法来自于网络修改
23 --------------------------------------------------------------------------------------------
24 --功能描述: 大数据量分页通用存储过程,超过100W数据的表,尽量加上索引上的条件
25 --创建时间: 2009-11-4
26 --------------------------------------------------------------------------------------------/
27 procedure PageSplit_SP
28 (
29 PageSize int, --每页记录数
30 PageIndex int, --当前页码,从 1 开始
31 SqlText string, --查询语句,含排序部分
32 Records_out out int,--返回总记录数
33 Table_out out DataTable ----返回当前页数据记录
34 ) as --对包中定义的SP1的实现
35 v_sql varchar2(8000); -- 不要超过32767个字符,不可以使用nvarchar2型,下面用的是to_char()
36 v_count int;
37 v_maxRownum int;
38 v_minRownum int;
39 begin
40 --取记录总数
41 v_sql := 'select count(*) from (' || SqlText || ')'; --拼接统计Sql
42 execute immediate v_sql into v_count; --执行统计
43 Records_out := v_count;
44
45 --行位置判断
46 v_maxRownum := PageIndex * PageSize;
47 v_minRownum := v_maxRownum - PageSize + 1;
48
49 --拼接查询语句
50 v_sql := 'SELECT *
51 FROM (
52 SELECT A.*, rownum rn
53 FROM ('|| SqlText ||') A
54 WHERE rownum <= '|| to_char(v_maxRownum) || '
55 ) B
56 WHERE rn >= ' || to_char(v_minRownum) ;
57 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
58
59 open Table_out for v_sql;
60
61 end;
62
63
64 /**//*****************************************************************
65 *功能描述: 大数据量分页通用存储过程(重载1,直接返回分页数量)
66 *创建时间: 2009-11-3
67 *****************************************************************/
68 procedure PageSplit_SP
69 (
70 PageSize int, --每页记录数
71 PageIndex int, --当前页码,从 1 开始
72 SqlText string, --查询语句,含排序部分
73 Records_out out int,--返回总记录数
74 Pages_out out int, --返回分出的页数
75 Table_out out DataTable ----返回当前页数据记录
76 )
77 as
78 v_sql varchar2(8000);
79 v_count int;
80 v_maxRownum int;
81 v_minRownum int;
82 begin
83 ----取记录总数
84 v_sql := 'select count(*) from (' || SqlText || ')'; --生成统计字符串
85 execute immediate v_sql into v_count; --执行统计
86 Records_out := v_count;
87
88 --行位置判断
89 v_maxRownum := PageIndex * PageSize;
90 v_minRownum := v_maxRownum - PageSize + 1;
91
92 --拼接查询语句
93 v_sql := 'SELECT *
94 FROM (
95 SELECT A.*, rownum rn
96 FROM ('|| SqlText ||') A
97 WHERE rownum <= '|| to_char(v_maxRownum) || '
98 ) B
99 WHERE rn >= ' || to_char(v_minRownum) ;
100 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
101
102 OPEN Table_out FOR v_sql;
103
104 end;
105
106
107 /**//*****************************************************************
108 *功能描述: 大数据量分页通用存储过程(重载2,自定义统计查询,推荐使用)
109 *创建时间: 2009-11-3
110 *****************************************************************/
111 procedure PageSplit_SP
112 (
113 PageSize int, --每页记录数
114 PageIndex int, --当前页码,从 1 开始
115 SqlText string, --查询语句,含排序部分
116 SqlTextCount string, --获取记录总数的查询语句
117 Records_out out int, --返回总记录数
118 Table_out out DataTable)
119 as
120 v_sql varchar2(8000);
121 v_count int;
122 v_maxRownum int;
123 v_minRownum int;
124 begin
125 ----取记录总数
126 execute immediate SqlTextCount into v_count;
127 Records_out := v_count;
128 ----执行分页查询
129 v_maxRownum := PageIndex * PageSize;
130 v_minRownum := v_maxRownum - PageSize + 1;
131
132 v_sql := 'SELECT *
133 FROM (
134 SELECT A.*, rownum rn
135 FROM ('|| SqlText ||') A
136 WHERE rownum <= '|| to_char(v_maxRownum) || '
137 ) B
138 WHERE rn >= ' || to_char(v_minRownum) ;
139 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
140
141 OPEN Table_out FOR v_sql;
142
143 end ;
144
145 /**//*****************************************************************
146 *功能描述: 大数据量分页通用存储过程(重载3,不输出总记录数,适用于外部分页计算,内部直选记录集,DB计算压力最小)
147 *创建时间: 2009-11-3
148 *****************************************************************/
149 procedure PageSplit_SP
150 (
151 PageSize int, --每页记录数
152 PageIndex int, --当前页码,从 1 开始
153 SqlText string, --查询语句,含排序部分
154 Table_out out DataTable
155 )
156 as
157 v_sql varchar2(8000);
158 v_maxRownum int;
159 v_minRownum int;
160 begin
161
162 ----执行分页查询
163 v_maxRownum := PageIndex * PageSize;
164 v_minRownum := v_maxRownum - PageSize + 1;
165
166 v_sql := 'SELECT *
167 FROM (
168 SELECT A.*, rownum rn
169 FROM ('|| SqlText ||') A
170 WHERE rownum <= '|| to_char(v_maxRownum) || '
171 ) B
172 WHERE rn >= ' || to_char(v_minRownum) ;
173 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
174
175 OPEN Table_out FOR v_sql;
176
177 end;
178
179
180 end;
181
182
浙公网安备 33010602011771号