Oracle ——存储过程——分页

 

输入:表名、每页显示的记录数、当前页
输出:总记录数、总页数、结果集

--首先,创建一个包,定义游标类型
CREATE OR REPLACE PACKAGE fenye_package IS
TYPE fenye_cursor IS REF CURSOR;
END fenye_package;

--然后创建一个存储过程
--输入:表名、每页显示的记录数、当前页
--输出:总记录数、总页数、结果集
CREATE OR REPLACE PROCEDURE sp_fenye
(tableName   IN VARCHAR2,--表名称
 orderBy     IN VARCHAR2,--排序方式 字段设为 order by 列名 asc|desc
 maxresult   IN NUMBER,  --每页记录数
 currentpage IN NUMBER,  --当前页
 totalrecord OUT NUMBER, --总记录数
 totalpage   OUT NUMBER, --总页数
 p_cursor    OUT fenye_package.fenye_cursor -- 输出结果集
) IS
--变量定义部分
v_sql   varchar2(1000); --sql分页语句
v_begin number:=(currentpage-1)*maxresult;--开始行号
v_end   number:=currentpage*maxresult;    --结束行号
BEGIN
  v_sql:= 'SELECT * FROM (SELECT T1.*,ROWNUM RN FROM
          (SELECT * FROM '||tableName||' '||orderBy||') T1 WHERE ROWNUM <='||v_end||')
          WHERE RN >'||v_begin;
  open p_cursor for v_sql;--把分页语句与游标关联
 
  --计算总记录数
  v_sql:= 'select count(*) from '||tableName;
  execute immediate v_sql into totalrecord;--执行sql并把返回的结果值赋值给totalrecord
  --计算总页数
  if mod(totalrecord,maxresult)=0 then
    totalpage:=totalrecord/maxresult;
  else
    totalpage:=totalrecord/maxresult+1;
    --totalpage:=trunc(totalrecord/maxresult,0)+1;
  end if;
  --关闭游标,应该有程序关闭游标,否则程序使用该游标将报错
  --close p_cursor;
END sp_fenye;

--Java调用存储过程

 

 1 import java.io.IOException;
 2 import java.sql.CallableStatement;
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.ResultSet;
 6 
 7 public class Test {
 8 
 9     /**
10      * @param args
11      * @throws ClassNotFoundException
12      * @throws IOException
13      */
14     public static void main(String[] args) {
15         // TODO Auto-generated method stub
16         Connection ct = null;
17         CallableStatement cs = null;
18         ResultSet rs = null;
19         try {
20             Class.forName("oracle.jdbc.driver.OracleDriver");
21 
22             ct = DriverManager.getConnection(
23                     "jdbc:oracle:thin:@172.18.128.165:1521:orcl", "scott",
24                     "803");
25 
26             cs = ct.prepareCall("{call sp_fenye(?,?,?,?,?,?,?)}");
27             cs.setString(1, "emp");// 表名称
28             cs.setString(2, "order by sal desc");// 排序
29             cs.setInt(3, 5); // 每页记录数
30             cs.setInt(4, 1); // 当前页
31             cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);// 总记录数
32             cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER);// 总页数
33             cs.registerOutParameter(7, oracle.jdbc.OracleTypes.CURSOR);// 结果集
34 
35             cs.execute();
36             int totalRecord = cs.getInt(5);
37             int totalPage = cs.getInt(6);
38             rs = (ResultSet) cs.getObject(7);
39 
40             System.out.println("总记录数:" + totalRecord);
41             System.out.println("总页数:" + totalPage);
42 
43             while (rs.next()) {
44                 System.out.println("编号:" + rs.getInt(1) + " 姓名:"
45                         + rs.getString(2) + " 工资:" + rs.getFloat(6));
46             }
47             //关闭资源
48             if(rs!=null)
49                 rs.close();
50             if(cs!=null)
51                 cs.close();
52             if(ct!=null)
53                 ct.close();
54 
55         } catch (Exception e) {
56             // TODO Auto-generated catch block
57             e.printStackTrace();
58         }
59     }
60 
61 }

 

posted on 2014-05-01 22:33  Sunny_NUAA  阅读(340)  评论(0编辑  收藏  举报

导航