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

编写分页过程

通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标,如何在java中调用等内容的学习。

1、无返回值的存储过程

例如 1、可以向book表添加书,

---建表

Create table book(bookId number,bookName varchar2(50),publishHouse
varchar2(50));

--编写过程 in
表示变量为输入值,如果不写默认为输入值,而不是输出变量,out为输出值

Create or replace procedure  sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in  varchar2)is

Begin

Insert into book valuse(spBookId ,spbookName,sppublishHouse  );

End

---java
中如何调用

Package com.sp;
Importjava.sql.*;
Publicclass Test1{
 public static void main(string[] args){

   try{
    //1加载驱动
     Class.forName("Oracle.jdbc.driver.OracleDriver");
     Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
    //2创建callablestatement
    Callablestatement cs=ct.preparecall(“{call sp_pro7(?,?,?)}”);
   //给?赋值
    Cs.setInt(1,10);
    Cs.setstring(2,“笑傲江湖”);
    Cs.setstring(3,"人民出版社");
   //执行
    Cs.execute();;

      }
   Catch(EXCEPTION E){
    e.printstacktrace();

     }
Finally{
  关闭各个链接

      }

    }

}

2、有返回值的存储过程

例如输入书编号返回书姓名

Create or replace  procedure sp_pro8(spno in number,spkName out varchar2,spsal
out varchar2) is

Begin

select  ename
,spsal,into spName, spsal form emp where empno=spno;

End

在java中如何调用

Package com.sp;
Importjava.sql.*;
  Publicclass Test1{
     public static void main(string[] args){

      try{
       //1加载驱动
       Class.forName("Oracle.jdbc.driver.OracleDriver");
       Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
       //2创建callablestatement
       Callablestatement cs=ct.preparecall(“{call sp_pro8(?,?)}”);
       //给?赋值
       Cs.setInt(1,7788);
       Cs.registerOutParemeter(2,oracle.jdbc.oracleTyps.varchar)//执行
       Cs.registerOutParemeter(3,oracle.jdbc.oracleTyps.double)//执行 //oracle.jdbc.oracleTyps.varchar 表示执行的类型
       Cs.execute();
        //取出返回值,要注意?顺序
       String name=sc.getstring(2);
       String job=cs.getstring(3);
       System.out.println(“7788的名字”+name +“7788的工资”+sal);

     }
     Catch(EXCEPTION E){
      e.printstacktrace();

     }
    Finally{
  关闭各个链接

     }

    }

}

3、有返回值的存储过程,以列表结果集的形式返回

oracle存储过程本身没有返回时用out参数替代的,集合需要用package

--建立包,定义类型test_cursor

Create or replace packagetestpackage as

Typetest_cursur is
ref cursor;

End testpackage

建立存储过程

Create or repalce procedure sp_pro9(spNo in number,P_cursor out tespackage,test_cursor) is

begin

Open p_cursor for select *from emp where depto-spNo;

End;

--如何在java中调用

Package com.sp;
Importjava.sql.*;
Publicclass Test1{
   public static void main(string[] args){

     try{
    //1加载驱动
     Class.forName("Oracle.jdbc.driver.OracleDriver");
     Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
    //2创建callablestatement
     Callablestatement cs=ct.preparecall(“{call sp_pro9(?,?)}”);
    //给?赋值
    Cs.setInt(1,10);
    Cs.registerOutParemeter(2,oracle.jdbc.oracleTypes.cursor)
    //执行
     Cs.execute();
    //取出返回值,要注意?顺序
     ResultSet rs=(ResultSet)cs.getObject(2);
     While (rs.next()){
       system.out.println(rs.getInt(1)+""+rs.getString(2));
          }

      }
   Catch(EXCEPTION E){
      e.printstacktrace();
    }
  Finally{
  关闭各个链接

      }

    }

  }

4、----oracle的分页规律介绍

Sql>select t1.*,
rownum rn from(select * from emp) t1;

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

--在分页的时候,可以

Select *from(

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

--开发一个包

Create or replace package  testpackage as

Typetest_cursur is
ref cursor;

End  testpackage

5、--编写分写的过程  分页并按工资排序

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_endnumber:=Pagenow *Pagesize ;

Begin

--执行部分

v_sql:=‘Select * from(

Sql>select t1.*,
rownum rn from(select * from ‘||tableName||‘ order by sal) 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;

Executeimmediate v_sql into myrows;

-计算mypagecount

If  mod(myrows,pagesize)=0 then

Mypagecount:=myrows/pagesize;

Else

Mypagecount:=myrows/pagesize+1;

End if;

--关闭游标

Close p_cursor;

End;

--使用java测试

Package com.sp;
Importjava.sql.*;
  Public class Test1{
  public static void main(string[] args){

 try{
    //1加载驱动<span style="font-family: Arial, Helvetica, sans-serif;">    </span>
    Class.forName("Oracle.jdbc.driver.OracleDriver");<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
    Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
   //2创建callablestatement
   Callablestatement cs=ct.preparecall(“{call fenye(?,?,?,?,?,?)}”);
    //给?赋值
    Cs.setString(1,"emp"); 表
    Cs.setInt(2,5);每页大小
    Cs.setInt(3,2);第2页
    //接受总记录数
    Cs.registerOutParemeter(4,oracle.jdbc.oracleTypes.integer)//执行
   //注册总页数
   Cs.registerOutParemeter(5,oracle.jdbc.oracleTypes.integer)//执行
   //注册返回的结果集
     Cs.registerOutParemeter(6,oracle.jdbc.oracleTypes.cursor)//执行
    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(20)+"薪水";
      }
    }

   }
  Catch(EXCEPTION E){
    e.printstacktrace();

    }
   Finally{
  关闭各个链接

    }

   }

}

看似很复杂一个分页过程,通过一步步由简到繁的分解,由无返回值的存储过程,到有返回值,进而到以集合形式作为返回值的存储过程,加上简单的分页算法,基于pl/sql中包,游标,mod语句,if分支语句,变量的定义,oder by子句组成。学习的过程就是这样,一口一个胖子是不可能的,同样这也是人类认知的一个规律,由简到繁,在遇到复杂的问题要考虑如何将它拆分成简单的,自己熟知的问题,一步步了解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 06:52:21

Oracle基础(五)pl/sql进阶(分页过程)的相关文章

Oracle数据库之PL/SQL过程与函数

Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后再次

每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQL程序设计终极指南>志在打造PL/SQL领域最为系统.全面.实战.权威的著作,通过一系列非常突出的优势在大量的同类书中脱颖而出,成为该领域的标准读物. PL/SQL本身涉及的知识点浩瀚.庞杂,初学者根本无法依靠自身能力理清头绪,学习成本极高.本书对知识点进行了体系化的梳理,化繁杂为有序,突出重点,直指核

免安装Oracle客户端和PL/SQL

写在前面: Oracle是典型的C/S结构,服务端提供oracle服务的实例,主要用于数据库的管理,对象的管理与存储.数据的 存储.查询.数据库资源的监控.监听等一些服务.而客户端只是一个与服务端交互的工具,如sqlplus,在sqlplus 里执行SQL语句传到服务端,服务端进行解析后执行SQL里的操作,并将操作结果输出到客户端.这就完成了一个客户 端与服务端交互的过程.简单点说,客户端就像一个远程桌面工具,只负责提供链接后台服务器的界面,具体的处理 操作都在服务器上. 上一篇文章我们主要讲解

Oracle 客户端安装 + pl/sql工具安装配置

Oracle 客户端安装 +  pl/sql工具安装配置 下载oracle客户端,并在本地安装. 11g下载地址为: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 10g下载地址为: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 根据自己机器或者oracle服

Oracle Study之--PL/SQL Developer软件错误

Oracle Study之--PL/SQL Developer软件错误 博文在51cto和CSDN同时开通 系统环境: 操作系统: Windows  XP(64) 软件:          PL/SQL Devoloper 8.04         软件,正常安装后,在使用过程中出现以下错误:                                                                            通过scott用户登录  出现以上错误 通过sqlpl

Oracle数据库之PL/SQL异常处理

Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料到的事件.一个健壮的程序都应该能够正确处理各种异常情况,并尽可能从中恢复. 1. 异常处理 异常处理是用来处理正常执行过程中未预料的事件.PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行. PL/SQL编程过程中,有三种类型的异常: 1.预定义异常 对这种异常情况的处

Oracle数据库之PL/SQL程序设计简介

有利于客户/服务器环境应用的运行 对于客户/服务器环境来说,真正的瓶颈是网络上.无论网络多快,只要客户端与服务器进行大量的数据交换,应用运行的效率自然就回受到影响.如果使用PL/SQL进行编程,将这种具有大量数据处理的应用放在服务器执行,自然就省去了数据在网上的传输时间. 适合于客户环境 PL/SQL由于分为数据库PL/SQL部分和工具PL/SQL.对于客户端来说,PL/SQL可以嵌套到相应的工具中,客户端程序可以执行本地包含PL/SQL部分,也可以向服务发SQL命令或激活服务器端的PL/SQL

Oracle 11g 的PL/SQL函数结果缓存

模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1,test2)),试验证明不对,函数f1()并没有使用RELIES_ON,但表上的变化影响到了函数. C:\Documents and Settings\guogang>sqlplus gg_test/[email protected]_gg SQL*Plus: Release 10.2.0.1.0

《oracle每日一练》免安装Oracle客户端使用PL/SQL

免安装Oracle客户端使用PL/SQL Oracle客户端挺招人烦的,部署连接它的应用通常需要先安装它的客户端,安装程序要求在目标机器上写注册表,假设你没有洁癖的话,你仍可能被下面的事情绊住:当你的机器上的其他程序依赖于x64的Oracle的程序,并且它们很有可能根本不是你写的,因此你还不敢随便乱动服务器,但是你可能需要一个PL/SQL用来在相同的环境下执行查询,这个时候你还是需要一个免安装的办法来处理这个问题. 1.下载Oracle Instant Client (32-bit) 因为我的P