Oracle学习日历(十五)- PL/SQL分页

编写分页过程


  有了上面的基础,相信大家可以完成分页存储过程了。
  要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。
如果大家忘了oracle中如何分页,请参考第三天的内容。
先自己完成,老师在后面给出答案,并讲解。

--oracle的分页

Sql代码


select t1.*, rownum rn from (select * from emp) t1 where rownum<=10;

--在分页时,大家可以把下面的sql语句当做一个模板使用

select * from

  (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10)

where rn>=6;

 



--开发一个包
--建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:

Sql代码

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 inmediate v_sql into myrows;   
--计算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;   
end;   
/  


--使用java测试
//测试分页

Java代码

import java.sql.*;   
public class FenYe{   
    public static void main(String[] args){   
           
        try{   
            //1.加载驱动   
            Class.forName("oracle.jdbc.driver.OracleDriver");   
            //2.得到连接   
            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
  
            //3.创建CallableStatement   
            CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");   
  
            //4.给第?赋值   
            cs.seString(1,"emp");   
            cs.setInt(2,5);   
            cs.setInt(3,2);   
  
            //注册总记录数   
            cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);   
            //注册总页数   
            cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);   
            //注册返回的结果集   
            cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);   
  
            //5.执行   
            cs.execute();    
  
            //取出总记录数   /这里要注意,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));   
            }    
        } catch(Exception e){   
            e.printStackTrace();   
        } finally{   
            //6.关闭各个打开的资源   
            cs.close();   
            ct.close();   
        }   
    }   
}  

运行,控制台输出:
rowNum=19
总页数:4
编号:7369 名字:SMITH 工资:2850.0
编号:7499 名字:ALLEN 工资:2450.0
编号:7521 名字:WARD 工资:1562.0
编号:7566 名字:JONES 工资:7200.0
编号:7654 名字:MARTIN 工资:1500.0


--新的需要,要求按照薪水从低到高排序,然后取出6-10
过程的执行部分做下改动,如下:

Sql代码

begin  
--执行部分   
v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||' order by sal) t1 where rownum<='||v_end||') where rn>='||v_begin;  


重新执行一次procedure,java不用改变,运行,控制台输出:
rowNum=19
总页数:4
编号:7900 名字:JAMES 工资:950.0
编号:7876 名字:ADAMS 工资:1100.0
编号:7521 名字:WARD 工资:1250.0
编号:7654 名字:MARTIN 工资:1250.0
编号:7934 名字:MILLER 工资:1300.0

 

猜你喜欢

转载自blog.csdn.net/zx03070723/article/details/81092346