码迷,mamicode.com
首页 > 数据库 > 详细

oracle15 pl/sql 分页

时间:2015-10-07 17:23:43      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

PL/SQL分页
编写分页过程 
 
无返回值的存储过程
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程: 
案例:现有一张表book,表结构如下:书号 书名 出版社 

请写一个过程,可以向book表添加书,要求通过java程序调用该过程。 
--in:表示这是一个输入参数,默认为in(不写in则默认就是in)
--out:表示一个输出参数 
Sql代码 
1.create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is  
2.begin  
3.    insert into book values(spBookId,spbookName,sppublishHouse);   
4.end;   
5./  


--在java中调用 Java代码 1.//调用一个无返回值的过程    2.import java.sql.*;    3.public class Test2{    4.    public static void main(String[] args){   6.        try{    7.            //1.加载驱动    8.            Class.forName("oracle.jdbc.driver.OracleDriver");    9.            //2.得到连接    10.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");    11.   12.            //3.创建CallableStatement    13.            CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");    14.            //4.给?赋值    15.            cs.setInt(1,10);    16.            cs.setString(2,"笑傲江湖");    17.            cs.setString(3,"人民出版社");    18.            //5.执行    19.            cs.execute();                20.        } catch(Exception e){    21.            e.printStackTrace();    22.        } finally{    23.            //6.关闭各个打开的资源    24.            cs.close();    25.            ct.close();    26.        }    27.    }    28.}   执行,记录被加进去了
有返回值的存储过程(非列表)
再看如何处理有返回值的存储过程: 
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。 
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。 
Sql代码 
1.--有输入和输出的存储过程   
2.create or replace procedure sp_pro8   
3.(spno in number, spName out varchar2) is  
4.begin  
5.    select ename into spName from emp where empno=spno;   
6.end;   
7./  

Java代码 
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
10.            //看看如何调用有返回值的过程   
11.            //创建CallableStatement   
12.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");   
13.  
14.            //给第一个?赋值   
15.            cs.setInt(1,7788);   
16.            //给第二个?赋值   
17.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);   
18.  
19.            //5.执行   
20.            cs.execute();      
21.            //取出返回值,要注意?的顺序   
22.            String name=cs.getString(2);    
23.            System.out.println("7788的名字"+name);           
24.        } catch(Exception e){   
25.            e.printStackTrace();   
26.        } finally{   
27.            //6.关闭各个打开的资源   
28.            cs.close();   
29.            ct.close();   
30.        }   
31.    }   
32.}  
运行,成功得出结果。。 
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。 
Sql代码 
1.--有输入和输出的存储过程   
2.create or replace procedure sp_pro8   
3.(spno in number, spName out varchar2,spSal out number,spJob out varchar2) is  
4.begin  
5.    select ename,sal,job into spName,spSal,spJob from emp where empno=spno;   
6.end;   
7./  

Java代码 
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
10.  
11.            //3.创建CallableStatement   
12.            /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");  
13.            //4.给?赋值  
14.            cs.setInt(1,10);  
15.            cs.setString(2,"笑傲江湖");  
16.            cs.setString(3,"人民出版社");*/  
17.  
18.            //看看如何调用有返回值的过程   
19.            //创建CallableStatement   
20.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");   
21.  
22.            //给第一个?赋值   
23.            cs.setInt(1,7788);   
24.            //给第二个?赋值   
25.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);   
26.            //给第三个?赋值   
27.            cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);   
28.            //给第四个?赋值   
29.            cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);   
30.  
31.            //5.执行   
32.            cs.execute();      
33.            //取出返回值,要注意?的顺序   
34.            String name=cs.getString(2);    
35.            String job=cs.getString(4);   
36.            System.out.println("7788的名字"+name+" 工作:"+job);           
37.        } catch(Exception e){   
38.            e.printStackTrace();   
39.        } finally{   
40.            //6.关闭各个打开的资源   
41.            cs.close();   
42.            ct.close();   
43.        }   
44.    }   
45.}  
运行,成功找出记录 
有返回值的存储过程(列表[结果集])
案例:编写一个过程,输入部门号,返回该部门所有雇员信息。 
对该题分析如下: 
  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分: 
返回结果集的过程 
1.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下: 
Sql代码 
1.create or replace package testpackage as  
2.  type test_cursor is ref cursor;   
3.end testpackage;  

2.建立存储过程。如下: 
Sql代码 
1.create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is  
2.begin  
3.  open p_cursor for  
4.    select * from emp where deptno = spNo;   
5.end sp_pro9;  


3.如何在java程序中调用该过程 
Java代码 
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
10.  
11.            //看看如何调用有返回值的过程   
12.            //3.创建CallableStatement   
13.            CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");   
14.  
15.            //4.给第?赋值   
16.            cs.setInt(1,10);   
17.            //给第二个?赋值   
18.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);   
19.  
20.            //5.执行   
21.            cs.execute();      
22.            //得到结果集   
23.            ResultSet rs=(ResultSet)cs.getObject(2);        
24.            while(rs.next()){   
25.                System.out.println(rs.getInt(1)+" "+rs.getString(2));   
26.            }    
27.        } catch(Exception e){   
28.            e.printStackTrace();   
29.        } finally{   
30.            //6.关闭各个打开的资源   
31.            cs.close();   
32.            ct.close();   
33.        }   
34.    }   
35.}  
运行,成功得出部门号是10的所有用户 
编写分页过程
  有了上面的基础,相信大家可以完成分页存储过程了。 
  要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。 
如果大家忘了oracle中如何分页,请参考第三天的内容。 
先自己完成,老师在后面给出答案,并讲解。 

--oracle的分页 
Sql代码 
1.select t1.*, rownum rn from (select * from emp) t1 where rownum<=10;   
2.--在分页时,大家可以把下面的sql语句当做一个模板使用   
3.select * from  
4.  (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10)   
5.where rn>=6;  

 

oracle15 pl/sql 分页

标签:

原文地址:http://www.cnblogs.com/yaowen/p/4858822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!