PL/SQL分页
编写分页过程 无返回值的存储过程
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程:
案例:现有一张表book,表结构如下:书号 书名 出版社 请写一个过程,可以向book表添加书,要求通过java程序调用该过程。
--in:表示这是一个输入参数,默认为in(不写in则默认就是in)
--out:表示一个输出参数
Sql代码
.create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is  
.begin  
.    insert into book values(spBookId,spbookName,sppublishHouse);   
.end;   
./   --在java中调用
Java代码
.//调用一个无返回值的过程   
.import java.sql.*;   
.public class Test2{   
.    public static void main(String[] args){   .        try{   
.            //1.加载驱动   
.            Class.forName("oracle.jdbc.driver.OracleDriver");   
.            //2.得到连接   
.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
.  
.            //3.创建CallableStatement   
.            CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");   
.            //4.给?赋值   
.            cs.setInt(,);   
.            cs.setString(,"笑傲江湖");   
.            cs.setString(,"人民出版社");   
.            //5.执行   
.            cs.execute();               
.        } catch(Exception e){   
.            e.printStackTrace();   
.        } finally{   
.            //6.关闭各个打开的资源   
.            cs.close();   
.            ct.close();   
.        }   
.    }   
.}  
执行,记录被加进去了
有返回值的存储过程(非列表)
再看如何处理有返回值的存储过程:
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
.--有输入和输出的存储过程   
.create or replace procedure sp_pro8   
.(spno in number, spName out varchar2) is  
.begin  
.    select ename into spName from emp where empno=spno;   
.end;   
./   Java代码
.import java.sql.*;   
.public class Test2{   
.    public static void main(String[] args){   
.           
.        try{   
.            //1.加载驱动   
.            Class.forName("oracle.jdbc.driver.OracleDriver");   
.            //2.得到连接   
.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
.            //看看如何调用有返回值的过程   
.            //创建CallableStatement   
.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");   
.  
.            //给第一个?赋值   
.            cs.setInt(,);   
.            //给第二个?赋值   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);   
.  
.            //5.执行   
.            cs.execute();      
.            //取出返回值,要注意?的顺序   
.            String name=cs.getString();    
.            System.out.println("7788的名字"+name);           
.        } catch(Exception e){   
.            e.printStackTrace();   
.        } finally{   
.            //6.关闭各个打开的资源   
.            cs.close();   
.            ct.close();   
.        }   
.    }   
.}  
运行,成功得出结果。。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
.--有输入和输出的存储过程   
.create or replace procedure sp_pro8   
.(spno in number, spName out varchar2,spSal out number,spJob out varchar2) is  
.begin  
.    select ename,sal,job into spName,spSal,spJob from emp where empno=spno;   
.end;   
./   Java代码
.import java.sql.*;   
.public class Test2{   
.    public static void main(String[] args){   
.           
.        try{   
.            //1.加载驱动   
.            Class.forName("oracle.jdbc.driver.OracleDriver");   
.            //2.得到连接   
.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
.  
.            //3.创建CallableStatement   
.            /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");  
13.            //4.给?赋值  
14.            cs.setInt(1,10);  
15.            cs.setString(2,"笑傲江湖");  
16.            cs.setString(3,"人民出版社");*/  
.  
.            //看看如何调用有返回值的过程   
.            //创建CallableStatement   
.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");   
.  
.            //给第一个?赋值   
.            cs.setInt(,);   
.            //给第二个?赋值   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);   
.            //给第三个?赋值   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.DOUBLE);   
.            //给第四个?赋值   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);   
.  
.            //5.执行   
.            cs.execute();      
.            //取出返回值,要注意?的顺序   
.            String name=cs.getString();    
.            String job=cs.getString();   
.            System.out.println("7788的名字"+name+" 工作:"+job);           
.        } catch(Exception e){   
.            e.printStackTrace();   
.        } finally{   
.            //6.关闭各个打开的资源   
.            cs.close();   
.            ct.close();   
.        }   
.    }   
.}  
运行,成功找出记录
有返回值的存储过程(列表[结果集])
案例:编写一个过程,输入部门号,返回该部门所有雇员信息。
对该题分析如下:
  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
返回结果集的过程
.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
.create or replace package testpackage as  
.  type test_cursor is ref cursor;   
.end testpackage;   .建立存储过程。如下:
Sql代码
.create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is  
.begin  
.  open p_cursor for  
.    select * from emp where deptno = spNo;   
.end sp_pro9;   .如何在java程序中调用该过程
Java代码
.import java.sql.*;   
.public class Test2{   
.    public static void main(String[] args){   
.           
.        try{   
.            //1.加载驱动   
.            Class.forName("oracle.jdbc.driver.OracleDriver");   
.            //2.得到连接   
.            Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");   
.  
.            //看看如何调用有返回值的过程   
.            //3.创建CallableStatement   
.            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代码
.select t1.*, rownum rn from (select * from emp) t1 where rownum<=;   
.--在分页时,大家可以把下面的sql语句当做一个模板使用   
.select * from  
.  (select t1.*, rownum rn from (select * from emp) t1 where rownum<=)   
.where rn>=;  
--开发一个包
--建立一个包,在该包中,我定义类型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();   
.--定义两个整数   
.v_begin number:=(pageNow-)*Pagesize+;   
.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= then这样写是错的   
. if mod(myrows,Pagesize)= then  
.   myPageCount:=myrows/Pagesize;   
. else  
.   myPageCount:=myrows/Pagesize+   
. 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:thin@127.0.0.1:1521:MYORA1","scott","m123");   
.  
.            //3.创建CallableStatement   
.            CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");   
.  
.            //4.给第?赋值   
.            cs.seString(,"emp");   
.            cs.setInt(,);   
.            cs.setInt(,);   
.  
.            //注册总记录数   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.INTEGER);   
.            //注册总页数   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.INTEGER);   
.            //注册返回的结果集   
.            cs.registerOutParameter(,oracle.jdbc.OracleTypes.CURSOR);   
.  
.            //5.执行   
.            cs.execute();    
.  
.            //取出总记录数   /这里要注意,getInt(4)中4,是由该参数的位置决定的   
.            int rowNum=cs.getInt();   
.  
.            int pageCount = cs.getInt();               
.            ResultSet rs=(ResultSet)cs.getObject();    
.  
.            //显示一下,看看对不对     
.            System.out.println("rowNum="+rowNum);   
.            System.out.println("总页数="+pageCount);   
.     
.            while(rs.next()){   
.                System.out.println("编号:"+rs.getInt()+" 名字:"+rs.getString()+" 工资:"+rs.getFloat());   
.            }    
.        } catch(Exception e){   
.            e.printStackTrace();   
.        } finally{   
.            //6.关闭各个打开的资源   
.            cs.close();   
.            ct.close();   
.        }   
.    }   
.}   运行,控制台输出:
rowNum=
总页数:
编号: 名字:SMITH 工资:2850.0
编号: 名字:ALLEN 工资:2450.0
编号: 名字:WARD 工资:1562.0
编号: 名字:JONES 工资:7200.0
编号: 名字:MARTIN 工资:1500.0
--新的需要,要求按照薪水从低到高排序,然后取出6-
过程的执行部分做下改动,如下:
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=
总页数:
编号: 名字:JAMES 工资:950.0
编号: 名字:ADAMS 工资:1100.0
编号: 名字:WARD 工资:1250.0
编号: 名字:MARTIN 工资:1250.0
编号: 名字:MILLER 工资:1300.0

oracle15 pl/sql 分页的更多相关文章

  1. 二十六、oracle pl/sql 分页

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

  2. oracle pl/sql 分页

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

  3. [oracle]pl/sql --分页过程demo

    这句sql能够用来查询一张表中的特定位置的记录 --查询的方法获取分页的语句 select *from (select t1.*,rownum rn from (select *from books) ...

  4. PL/SQL分页查询

    create or replace procedure fenye(tabelname in varchar2,currentpage in number,pageSize in number,inW ...

  5. Oracle实践--PL/SQL综合之分页存储过程

    Oracle PL/SQL分页的存储过程 Oracle,分页,存储过程三个词结合起来,来个综合点的小练习,运用之前的PL/SQL创建一个分页的存储过程,仅仅须要简单几步就可以. 1.声明一个引用游标 ...

  6. Oracle基础(五)pl/sql进阶(分页过程)

    编写分页过程         通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...

  7. Oracle和MySql的分页查询区别和PL/SQL的基本概念

    Oracle和MySql的分页查询区别:     Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...

  8. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  9. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

随机推荐

  1. webservice 的权限验证

    1. http://blog.csdn.net/jaune161/article/details/25602655 2. http://wcp88888888.iteye.com/blog/13993 ...

  2. 【技术贴】解决vss中提交pdf下载打开空白乱码

    vss客户端需要安装一个Vss2005的补丁程序,而且之前上传的pdf文件重新删掉,再次上传进Vss中,再下载打卡就ok了. 补丁名称vs80-kb943847-x86-intl.exe 别人的csd ...

  3. IAR Embedded Workbench 破解方法+工具+授权文件

    转自IAR Embedded Workbench 破解方法+工具+授权文件 本文重点阐述了如何手动爆破 IAR EWARM 6.x以及生成License,目的一是和大家分享下,二是自己记录下过程,以便 ...

  4. 李洪强漫谈iOS开发[C语言-034]-程序的结构

  5. 产品设计中先熟练使用铅笔 不要依赖Axure

    在互联网产品领域,Axure已成为产品经理.产品设计师以及交互设计师的必备工具,从某种程度讲,Axure帮助我们建立低保真模型,便于与用户的需求验证,也帮助我们构思交互细节,使前端和开发人员更容易理解 ...

  6. redhat下升级gcc编译器

    在有网络的环境下,采用下载gcc源码进行编译的方式升级gcc版本,所以需要本身已有gcc编译器. 获取 gcc-4.9.2的包: wget http://gcc.skazkaforyou.com/re ...

  7. linux 复制文件时,报cp: omitting directory `XXX'

    今天在用linux命令进行文件复制时omitting cp -i BBS /opt/workspace/apache-tomcat-6,参数用的是 -i),所以也不太熟悉,原来,还有子目录文件,而是必 ...

  8. 【转】SourceTree的简单使用

    原文网址:http://blog.csdn.net/u011439289/article/details/42126507 今天开始参与公司项目的代码编写,公司内部采用的是gitlib,所以用到了So ...

  9. Android性能测试

    FPS和流畅度 FPS 1.dumpsys SurfaceFlinger –latency shell 脚本通过 dumpsys SurfaceFlinger --latency 数据计算 FPS 和 ...

  10. HDOJ/HDU 1984 Mispelling4(删除第n个字符~)

    Problem Description Misspelling is an art form that students seem to excel at. Write a program that ...