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) 编辑 收藏 举报