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(); } } } ======================================================================