-- 先创建包
CREATE OR REPLACE PACKAGE mypackage AS TYPE mycursor IS REF CURSOR;
END;
|
--创建分页存储过程
CREATE OR REPLACE PROCEDURE splitpage
(
v_tableName IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(
1000
);
v_begin NUMBER:=(v_pageNow-
1
)*v_pageSize+
1
;
v_end NUMBER:=v_pageNow*v_pageSize;
BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from ' ||v_tableName||
') a1 where rownum<='
||v_end||
') where rn>='
||v_begin||
''
;
OPEN v_cursor FOR v_sql;
v_sql:=
'select count(*) from '
||v_tableName||
''
;
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=
0
THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+
1
;
END IF;
END;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
YOURClass getSplitPage(
int
targetPage,
int
eachpagenum){
Connection conn = DBConnection.getConn();
//获取Oraccle 的Connection
//参数位置要与存储过程对应,其余用法跟pstmt类似
String sql =
"{call splitpage(?,?,?,?,?,?)}"
;
try
{
cs = conn.prepareCall(sql);
cs.setString(
1
,
"tablename"
);
// the name of db's table
cs.setInt(
2
,eachpagenum);
// Each page record numbers
cs.setInt(
3
,targetPage);
// Target page number
// register the output
cs.registerOutParameter(
4
,OracleTypes.NUMBER);
cs.registerOutParameter(
5
,OracleTypes.NUMBER);
cs.registerOutParameter(
6
,OracleTypes.CURSOR);
cs.execute();
// get the value from CallableStatement
totalRowsCount = cs.getInt(
4
);
// 获取总记录数
totalPagesCount = cs.getInt(
5
);
// 获取总页数
ResultSet rs = (ResultSet) cs.getObject(
6
);
while
(rs.next()){
// 从rs中读取数据
}
return
YOURClass;
}
catch
(SQLException e){
e.printStackTrace();
}
return
null
;
}
|
下面就不给出JAVA代码了,因为都是类似的。用法跟pstmt一样,只是多了注册输出变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
--带模糊查询的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzy
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(
1000
);
v_begin NUMBER:=(v_pageNow-
1
)*v_pageSize+
1
;
v_end NUMBER:=v_pageNow*v_pageSize;
BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from
' ||v_tableName||'
where
'||v_colName||'
like
''
%
'|| v_keyword ||'
%
''
'||
') a1 where rownum<='
||v_end||
') where rn>='
||v_begin||
''
;
OPEN v_cursor FOR v_sql;
v_sql:=
'select count(*) from '
||v_tableName||
''
;
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=
0
THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+
1
;
END IF;
END;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
--带模糊查询带排序的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzyorder
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_colOrder IN VARCHAR2,
v_orderType IN VARCHAR2,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(
1000
);
v_begin NUMBER:=(v_pageNow-
1
)*v_pageSize+
1
;
v_end NUMBER:=v_pageNow*v_pageSize;
BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from
' ||v_tableName||'
where
'||v_colName||'
like
''
%
'|| v_keyword ||'
%
''
'||
' order by '
||v_colOrder||
' '
||v_orderType||
') a1 where rownum<='
||v_end||
') where rn>='
||v_begin||
''
;
OPEN v_cursor FOR v_sql;
v_sql:=
'select count(*) from '
||v_tableName||
''
;
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=
0
THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+
1
;
END IF;
END;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
--带模糊查询带排序带时间段的分页
CREATE OR REPLACE PROCEDURE splitpagefuzzyorderdate
(
v_tableName IN VARCHAR2,
v_colName IN VARCHAR2,
v_keyword IN VARCHAR2,
v_colOrder IN VARCHAR2,
v_orderType IN VARCHAR2,
v_colDate IN DATE;
v_dateBegin IN DATE,
v_dateEnd IN DATE,
v_pageSize IN NUMBER,
v_pageNow IN NUMBER,
v_myTotalRows OUT NUMBER,
v_myTotalPageCount OUT NUMBER,
v_cursor OUT mypackage.mycursor
)
IS
v_sql VARCHAR2(
1000
);
v_begin NUMBER:=(v_pageNow-
1
)*v_pageSize+
1
;
v_end NUMBER:=v_pageNow*v_pageSize;
BEGIN
v_sql:='select * from(
select rownum rn,a1.* from(
select * from
' ||v_tableName||'
where
'||v_colName||'
like
''
%
'|| v_keyword ||'
%
''
'||
' and '
v_colDate||
' between '
v_dateBegin ||
' and '
||v_dateEnd ||
' order by '
||v_colOrder||
' '
||
') a1 where rownum<='
||v_end||
') where rn>='
||v_begin||
''
;
OPEN v_cursor FOR v_sql;
v_sql:=
'select count(*) from '
||v_tableName||
''
;
EXECUTE IMMEDIATE v_sql INTO v_myTotalRows;
IF MOD(v_myTotalRows,v_pageSize)=
0
THEN
v_myTotalPageCount:=v_myTotalRows/v_pageSize;
ELSE
v_myTotalPageCount:=v_myTotalRows/v_pageSize+
1
;
END IF;
END;
|
这几个下来想必大家也都清楚该怎么做了。如果需要添加什么条件,只需要在最内层字句中添加相应