分页是任何一个网站(bbs,网上商城,blog)都会使用到的技术,因此学习pl/sql编程开发就一定要掌握该技术。如下图:

1.  编写无返回值的存储过程

首先是掌握最简单的存储过程,无返回值的存储过程。

案例:现有一张表book,表结构如下:

请写一个过程,可以向book表添加书,要求通过java程序调用该过程。  --in:表示这是一个输入参数,默认为in  --out:表示一个输出参数  存储过程代码如下:

[c-sharp] view plaincopy

  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;

在java中调用中调用该过程代码如下:

  1. //调用一个无返回值的过程
  2. import java.sql.*;
  3. public class Test2{
  4. public static void main(String[] args){
  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. //3.创建CallableStatement
  11. CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
  12. //4.给?赋值
  13. cs.setInt(1,10);
  14. cs.setString(2,"笑傲江湖");
  15. cs.setString(3,"人民出版社");
  16. //5.执行
  17. cs.execute();
  18. } catch(Exception e){
  19. e.printStackTrace();
  20. } finally{
  21. //6.关闭各个打开的资源
  22. cs.close();
  23. ct.close();
  24. }
  25. }
  26. }

执行,记录被加进去了。

2.  有返回值的存储过程(非列表) 案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。  案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。

存储过程代码如下:

[c-sharp] view plaincopy

  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;

java调用过程代码如下:

  1. import java.sql.*;
  2. public class Test2{
  3. public static void main(String[] args){
  4. try{
  5. //1.加载驱动
  6. Class.forName("oracle.jdbc.driver.OracleDriver");
  7. //2.得到连接
  8. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
  9. //3.创建CallableStatement
  10. /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
  11. //4.给?赋值
  12. cs.setInt(1,10);
  13. cs.setString(2,"笑傲江湖");
  14. cs.setString(3,"人民出版社");*/
  15. //看看如何调用有返回值的过程
  16. //创建CallableStatement
  17. /*CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
  18. //给第一个?赋值
  19. cs.setInt(1,7788);
  20. //给第二个?赋值
  21. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
  22. //5.执行
  23. cs.execute();
  24. //取出返回值,要注意?的顺序
  25. String name=cs.getString(2);
  26. System.out.println("7788的名字"+name);
  27. } catch(Exception e){
  28. e.printStackTrace();
  29. } finally{
  30. //6.关闭各个打开的资源
  31. cs.close();
  32. ct.close();
  33. }
  34. }
  35. }

运行,成功得出结果。

案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。

[c-sharp] view plaincopy

  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;

java调用过程代码如下:

  1. import java.sql.*;
  2. public class Test2{
  3. public static void main(String[] args){
  4. try{
  5. //1.加载驱动
  6. Class.forName("oracle.jdbc.driver.OracleDriver");
  7. //2.得到连接
  8. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
  9. //3.创建CallableStatement
  10. /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
  11. //4.给?赋值
  12. cs.setInt(1,10);
  13. cs.setString(2,"笑傲江湖");
  14. cs.setString(3,"人民出版社");*/
  15. //看看如何调用有返回值的过程
  16. //创建CallableStatement
  17. /*CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");
  18. //给第一个?赋值
  19. cs.setInt(1,7788);
  20. //给第二个?赋值
  21. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
  22. //给第三个?赋值
  23. cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);
  24. //给第四个?赋值
  25. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);
  26. //5.执行
  27. cs.execute();
  28. //取出返回值,要注意?的顺序
  29. String name=cs.getString(2);
  30. String job=cs.getString(4);
  31. System.out.println("7788的名字"+name+" 工作:"+job);
  32. } catch(Exception e){
  33. e.printStackTrace();
  34. } finally{
  35. //6.关闭各个打开的资源
  36. cs.close();
  37. ct.close();
  38. }
  39. }
  40. }

运行,成功找出记录。 3.  有返回值的存储过程(列表[结果集])

案例:编写一个过程,输入部门号,返回该部门所有雇员信息。  对该题分析如下:       由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:  (1). 建立一个包,在该包中,我定义类型test_cursor,是个游标。代码如下:

[c-sharp] view plaincopy

  1. create or replace package testpackage as
  2. TYPE test_cursor is ref cursor;
  3. end testpackage;

(2). 建立存储过程,代码如下:

[c-sharp] view plaincopy

  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中调用该过程,代码如下:

  1. import java.sql.*;
  2. public class Test2{
  3. public static void main(String[] args){
  4. try{
  5. //1.加载驱动
  6. Class.forName("oracle.jdbc.driver.OracleDriver");
  7. //2.得到连接
  8. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
  9. //看看如何调用有返回值的过程
  10. //3.创建CallableStatement
  11. /*CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");
  12. //4.给第?赋值
  13. cs.setInt(1,10);
  14. //给第二个?赋值
  15. cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
  16. //5.执行
  17. cs.execute();
  18. //得到结果集
  19. ResultSet rs=(ResultSet)cs.getObject(2);
  20. while(rs.next()){
  21. System.out.println(rs.getInt(1)+" "+rs.getString(2));
  22. }
  23. } catch(Exception e){
  24. e.printStackTrace();
  25. } finally{
  26. //6.关闭各个打开的资源
  27. cs.close();
  28. ct.close();
  29. }
  30. }
  31. }

运行,成功得出部门号是10的所有用户。

4.  编写分页过程       要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。  (1). oracle中的分页实现:

[c-sharp] view plaincopy

  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;

(2). 开发一个包

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

[c-sharp] view plaincopy

  1. create or replace package testpackage as
  2. TYPE test_cursor is ref cursor;
  3. end testpackage;
  4. --开始编写分页的过程
  5. create or replace procedure fenye
  6. (tableName in varchar2,
  7. Pagesize in number,--一页显示记录数
  8. pageNow in number,
  9. myrows out number,--总记录数
  10. myPageCount out number,--总页数
  11. p_cursor out testpackage.test_cursor--返回的记录集
  12. ) is
  13. --定义部分
  14. --定义sql语句 字符串
  15. v_sql varchar2(1000);
  16. --定义两个整数
  17. v_begin number:=(pageNow-1)*Pagesize+1;
  18. v_end number:=pageNow*Pagesize;
  19. begin
  20. --执行部分
  21. v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;
  22. --把游标和sql关联
  23. open p_cursor for v_sql;
  24. --计算myrows和myPageCount
  25. --组织一个sql语句
  26. v_sql:='select count(*) from '||tableName;
  27. --执行sql,并把返回的值,赋给myrows;
  28. execute inmediate v_sql into myrows;
  29. --计算myPageCount
  30. --if myrows%Pagesize=0 then这样写是错的
  31. if mod(myrows,Pagesize)=0 then
  32. myPageCount:=myrows/Pagesize;
  33. else
  34. myPageCount:=myrows/Pagesize+1
  35. end if;
  36. --关闭游标
  37. close p_cursor;
  38. end;

(3). 使用java测试该分页过程,代码如下:

  1. import java.sql.*;
  2. public class FenYe{
  3. public static void main(String[] args){
  4. try{
  5. //1.加载驱动
  6. Class.forName("oracle.jdbc.driver.OracleDriver");
  7. //2.得到连接
  8. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
  9. //3.创建CallableStatement
  10. CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
  11. //4.给第?赋值
  12. cs.seString(1,"emp");
  13. cs.setInt(2,5);
  14. cs.setInt(3,2);
  15. //注册总记录数
  16. cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
  17. //注册总页数
  18. cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
  19. //注册返回的结果集
  20. cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
  21. //5.执行
  22. cs.execute();
  23. //取出总记录数   /这里要注意,getInt(4)中4,是由该参数的位置决定的
  24. int rowNum=cs.getInt(4);
  25. int pageCount = cs.getInt(5);
  26. ResultSet rs=(ResultSet)cs.getObject(6);
  27. //显示一下,看看对不对
  28. System.out.println("rowNum="+rowNum);
  29. System.out.println("总页数="+pageCount);
  30. while(rs.next()){
  31. System.out.println("编号:"+rs.getInt(1)+" 名字:"+rs.getString(2)+" 工资:"+rs.getFloat(6));
  32. }
  33. } catch(Exception e){
  34. e.printStackTrace();
  35. } finally{
  36. //6.关闭各个打开的资源
  37. cs.close();
  38. ct.close();
  39. }
  40. }
  41. }

运行,控制台输出:       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。

代码如下:

[c-sharp] view plaincopy

  1. begin
  2. --执行部分
  3. 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

plsql分页的更多相关文章

  1. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...

  2. Oracle分页存储过程及PLSQL中的调用脚本

    撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家 测试步骤:1.运行创建包命令;2.运行创建存储过程命令;3.运行调用分页存储过程语句 测试环境:wind ...

  3. PLSQL实现分页查询

    --集合实现游标查询 CREATE OR REPLACE PACKAGE emppkg IS TYPE t_record IS RECORD( rn INT, empno emp.empno%TYPE ...

  4. plsql&nbsp;分页

     select * from (select rownum rn,ps.* from (select * from user_t) ps ) where rn>=1 and rn<=10 ...

  5. plsql常用函数汇总

    在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLI ...

  6. C# SQL优化 及 Linq 分页

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  7. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  8. Oracle02——oracle分页、子查询、集合运算、处理数据、创建和管理表和其他数据库对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7289451.html --oracle分页(Pageing Query) select ...

  9. 给PLSQL插上飞翔的翅膀-PLSQL优化

    60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的S ...

随机推荐

  1. 【Java】多线程

    class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...

  2. 使用CoreData [2]

    使用CoreData [2] 此篇讲解CoreData处理关系型数据. 1. 先创建出Student于Teacher的实体. 2. 确定关系,并修改描述 3. 创建对象,并查看一下关系(Teacher ...

  3. Skype for Business Server 2015 企业语音部署和配置

    Skype for Business Server 2015包含的企业语音功能可实现更丰富的通信和协作.例如,可以将企业语音部署配置为启用Skype for Business Server 2015客 ...

  4. CSS学习摘要-盒子模型

    注:全文摘要自网络开发者网站,当然间隔也会整理一些思路和格式排版添加进去. CSS框模型(译者注:也被称为"盒模型")是网页布局的基础 --每个元素被表示为一个矩形的方框,框的内容 ...

  5. ZT 内地20年经典电视剧大全

    内地20年经典电视剧大全     片尾曲:<故事就是故事> 演唱:戴娆 我听爷爷讲了一个故事 故事里的事是那昨天的事 故事里有好人也有坏人 故事里有好事也有坏事 故事里有多少是是非非 故事 ...

  6. Extjs tree 过滤查询功能

    转载: http://blog.csdn.net/xiaobai51509660/article/details/36011899 Extjs4.2中,对于treeStore中未实现filterBy函 ...

  7. Java虚拟机15:运行期优化

    前言 HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再讲得具体一点而已.当然,其实本文的内容也没多大意义,90%都是概念上的东西,对于实际开发. ...

  8. 第七周:Python

    python的应用场景 重复性的东西编写脚本 和对于大数据量的操作 数据搭建的环境 不建议自己在网上找下载,建议下载anaconda,可在清华镜像里面下载anaconda,下载安装之后可在桌面上找到程 ...

  9. 第五周:MySQL数据库

    首先,先了解一下数据库的基本概念要点: 数据库是数据存储的集合,表示数据结构化的信息 列存储表中的信息 行存储表的明细 主键是表中的唯一标识 主键不具备业务意义 在实际操作中,对表的主键不做强制性要求 ...

  10. PHP获取视频的第一帧与时长

    //获得视频文件的缩略图 function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $s ...