oracle--分页过程demo1

oracle分页过程demo1:

--ROWNUM用法
select o.*,rownum rn from (select * from emp) o where rownum<=10;

select * from (select o.*,rownum rn from (select * from emp) o where rownum<=10) where rn>=6;

1)、开发一个包
建立一个包,在该包中定义类型为test_cursor的游标。
--建立一个包

create or replace package testpackage
as
type test_cursor is ref cursor;
end testpackage;

--开始编写分页的过程
create or replace procedure fenye
(
tablename in varchar2,
pagesize in number,--每页显示记录数
pagenow in number,--页数
myrows out number,--总记录数
mypagecount out number,--总页数
p_cursor out testpackage.test_cursor--返回的记录集
)is
--定义部分
--定义sql语句字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pagenow-1)*pagesize+1;
v_end number:=pagenow*pagesize;
begin
--执行部分
v_sql:='select * from(select t1.*,rownum rn from (select * from '||tablename||') t1 where rownum<='||v_end||')where rn>='||v_begin;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql语句
v_sql:='select count(*) from '||tablename;
--执行sql,并把返回的值,赋给myrows
execute immediate v_sql into myrows;--它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前
--EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.
 --尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 
--计算myPageCount
--if myrows%Pagesize=0 then 这样写是错的
if mod(myrows,pagesize)=0 then
mypagecount:=myrows/pagesize;
else
mypagecount:=myrows/pagesize+1;
end if;
--关闭游标
--CLOSE P_CURSOR; --不要关闭,否则java调用该存储过程会报错
end;

package com.etc.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class CunChuDemo1 {
public static void main(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver"); // 1.加载驱动
		 // 2.得到连接
		Connection ct = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "orcl");
		CallableStatement cs = ct.prepareCall("call fenye(?,?,?,?,?,?)"); // 3.创建CallableStatement
		cs.setString(1, "emp"); //表名
		cs.setInt(2, 5);//每页显示记录数
		cs.setInt(3, 1);//页数
		cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);  // 注册总记录数
		cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); // 注册总页数
		cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR); // 注册返回的结果集
		cs.execute();  //4、执行
		 // 得到结果集
        // 取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的
		int rowNum=cs.getInt(4);
		int pageCount=cs.getInt(5);
		ResultSet rs=(ResultSet) cs.getObject(6);
		  System.out.println("rowNum=" + rowNum);
          System.out.println("总页数=" + pageCount);

          while (rs.next()) {
              System.out.println("编号:" + rs.getInt(1) + 
                      " 名字:" + rs.getString(2) + 
                      " 工资:" + rs.getFloat(6));
          }
		  //5、关闭
		rs.close();
		cs.close();
		ct.close();
	} catch (Exception e) {
		e.printStackTrace();
	}			
}
}
======================================================================

  

原文地址:https://www.cnblogs.com/ipetergo/p/6323663.html