Oracle存储过程(分页、模糊查找、排序、按字段区间查找)etc.以及JAVA代码

本文介绍了如何使用PL/SQL创建分页存储过程,包括基本分页、带模糊查询分页、带排序分页及带排序带时间段分页。通过示例展示了如何根据页面大小、当前页面、总记录数等参数实现数据分页展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 先创建包
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;

  这几个下来想必大家也都清楚该怎么做了。如果需要添加什么条件,只需要在最内层字句中添加相应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值