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. 第 5 章 工厂方法模式【Factory Method Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说 ...

  2. Kaggle Competition Past Solutions

    Kaggle Competition Past Solutions We learn more from code, and from great code. Not necessarily alwa ...

  3. QLGame 2d Engine Android端环境搭建(通过jni读取assets目录的文件)

    QLGame 2d Engine win端已经实现了一个动物的动画了,初步的东西已经完成,考虑在Android端也实现这些基本的东西,这样跨平台的引擎也就实现了! 要在Android下编程,首先要实现 ...

  4. NGINX+UWSGI部署生产的DJANGO代码

    并且NGINX不用ROOT帐户哟. 1,编译安装NGINX及UWSGI及DJANGO,不表述 2,将NGINX文件夹更改为普通用户拥有.但执行文件NGINX仍为ROOT,运行如下命令加入特殊权限标志位 ...

  5. 在TMemo上画一条线

    var C:TControlCanvas; begin C := TControlCanvas.Create; C.Pen.Color := clRed; C.Pen.Width := ; C.Con ...

  6. Yii modules中layout文件的调用

    在YII中,如果我们使用了modules区分了前后台,那么在不同的modules中需要使用各自的layout文件,在使用中发现经常会调用不到modules中的layout,下面介绍一下如何才能正确的调 ...

  7. 动态规划(计数DP):JLOI 2016 成绩比较

    Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个 ...

  8. android学习—— LayoutInflater的使用

    在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(),不同点是LayoutInflater是 用来找layout下xml布局文件,并且实例化!而fi ...

  9. 学习手工创建表,表关系以及用exists 来查询

    ---创建表a If exists(select * from sysobject where [name]=='a' and xType = 'u') Begin Drop table aa End ...

  10. 排序算法_MergeSort

    算法思想: 分治自顶而下实现归并排序: 分治法的三个步骤     设归并排序的当前区间是R[low..high],分治法的三个步骤是:①分解:将当前区间一分为二,即求分裂点               ...