Oracle存储过程创建及调用

在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器。在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的。相对来说,数据库系统中的触发器也是一种存储过程。存储过程在数据库中运算时自动生成各种执行方式,因此,大大提高了对其运行时的执行速度。在大型数据库系统如Oracle、SQL Server中都不仅提供了用户自定义存储过程的功能,同时也提供了许多可作为工具进行调用的系统自带存储过程。
   所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
   由于J2EE体系一般建立大型的企业级应用系统,而一般都配备大型数据库系统如Oracle或者SQL Server,在本文
《JAVA与Oracle存储过程》中将介绍JAVA跟Oracle存储过程之间的相互应用跟相互间的各种调用。
   一、JAVA调用Oracle存储过程
   JAVA跟Oracle之间最常用的是JAVA调用Oracle的存储过程,以下简要说明下JAVA如何对
Oracle存储过程进行调用。
 
  Ⅰ、不带输出参数情况
      过程名称为pro1参数个数1个数据类型为整形数据

import  java.sql. *
public   class  ProcedureNoArgs  
  { 
public   static   void main(String args[])  throws  Exception 

  
// 加载Oracle驱动 
  
DriverManager.registerDriver( new  oracle.jdbc.driver.OracleDriver()); 
  
// 获得Oracle数据库连接 
  
Connection conn =DriverManager.getConnection( " jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd" ); 

    
// 创建存储过程的对象 
    CallableStatement c = conn.divpareCall( " {call pro1(?)} " ); 
     
    
// 给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188 
    c.setInt( 1 , 188); 
     
    
// 执行Oracle存储过程 
    c.execute(); 
    conn.close(); 
}
 
}
 


   Ⅱ、带输出参数的情况
   过程名称为pro2参数个数2个数据类型为整形数据,返回值为整形类型

import  java.sql. *
public   class  ProcedureWithArgs  
  { 
public static void main(String args[]) throws Exception 

  
//加载Oracle驱动 
  
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
  
//获得Oracle数据库连接 
  
Connection conn =DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd"); 

    
//创建Oracle存储过程的对象,调用存储过程 
    CallableStatement c=conn.divpareCall("{call pro2(?,?)}"); 
     
    
//给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188 
    c.setInt(1,188); 
    //注册存储过程的第二个参数 
      c.registerOutParameter(2,java.sql.Types.INTEGER);
    
//执行Oracle存储过程 
    c.execute(); 
      //得到存储过程的输出参数值并打印出来
      System.out.println (c.getInt(2));
 
    conn.close(); 
}
 
}
 

 

 

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

Oracle存储过程可以有无参数存储过程和带参数存储过程。 
、无参程序过程语法

1  create  or  replace  procedure  NoParPro
2  as   ;
3  begin
4  ;
5  exception     //存储过程异常
6      ;
7  end ;
8 

        二、带参存储过程实例

 1  create  or  replace  procedure  queryempname(sfindno emp.empno % type)  as
 2         sName emp.ename % type;
 3         sjob emp.job % type;
 4  begin
 5         ....
 7  exception
          ....
14  end ;
15 

    三、 带参数存储过程含赋值方式
 1  create  or  replace  procedure  runbyparmeters  (isal  in  emp.sal % type,
                            sname out 
varchar ,sjob  in  out  varchar )
 2   as  icount  number ;
 3   begin
 4         select  count ( * into  icount  from  emp  where  sal > isal  and  job = sjob;
 5         if  icount = 1  then
 6          ....
 9         else
10          ....
12         end  if ;
13   exception
14         when  too_many_rows  then
15        DBMS_OUTPUT.PUT_LINE( ' 返回值多于1行 ' );
16         when  others  then
17        DBMS_OUTPUT.PUT_LINE( ' 在RUNBYPARMETERS过程中出错! ' );
18   end ;
19 

  四、在Oracle中对存储过程的调用
  过程调用方式一
 1  declare
 2         realsal emp.sal % type;
 3         realname  varchar ( 40 );
 4         realjob  varchar ( 40 );
 5   begin   //存储过程调用开始
 6         realsal: = 1100 ;
 7         realname: = '' ;
 8         realjob: = ' CLERK ' ;
 9         runbyparmeters(realsal,realname,realjob);     -- 必须按顺序
10         DBMS_OUTPUT.PUT_LINE(REALNAME || '     ' || REALJOB);
11   END ;  //过程调用结束
12 

  过程调用方式二
 1  declare
 2        realsal emp.sal % type;
 3        realname  varchar ( 40 );
 4        realjob  varchar ( 40 );
 5  begin    //过程调用开始
 6        realsal: = 1100 ;
 7        realname: = '' ;
 8        realjob: = ' CLERK ' ;
 9        runbyparmeters(sname => realname,isal => realsal,sjob => realjob);  -- 指定值对应变量顺序可变
10        DBMS_OUTPUT.PUT_LINE(REALNAME || '     ' || REALJOB);
11  END ;  //过程调用结束
12 

 

 至此,有关ORACLE的基本存储过程以及对Oracle存储过程的调用方式介绍完毕。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值