1、概念

对完成某一个功能的 一组 sql 语句和 plsql语句的一个逻辑整体。
这个逻辑整体有一个名字  对应 数据库中的逻辑。

2、复用

3、定义两个整数变量 选出 两个变量的最大值

declare
      var_x   number:=20;
      var_y   number:=30;
begin
      if  var_x < var_y then 
             dbms_output.put_line(var_y);
      else
             dbms_output.put_line(var_x);                 
      end if;
end;    
 /
------------------------------------------------------------------------------------------
create  or replace  procedure  getmax(var_x  number,var_y  number)
is
begin
      if  var_x < var_y then 
             dbms_output.put_line(var_y);
      else
             dbms_output.put_line(var_x);                 
      end if;
end;    
 /    

4、调用

call    getmax(1,10);
------------------------------------------------------------------------------------------
execute  getmax(200,300);
------------------------------------------------------------------------------------------
通过plsql程序来调用 
  begin
     getmax(101,999); 
  end;
  / 

5、写一个存储过程 可以完成两个参数最小值的选取 并使用匿名块调用

create  or  replace   procedure  getmin(var_x number:=1,var_y  number:=2) 
   is
begin
   if  var_x  < var_y  then 
         dbms_output.put_line(var_x);
   else
         dbms_output.put_line(var_y); 
   end if;
end;
/     
call  getmin();  
execute  getmin;
execute  getmin();
------------------------------------------------------------------------------------------
当不需要给参数传值时  call 必须使用()   execute 可以省略()
如果参数有默认值  则可以不给参数传值  不传值则使用参数的默认值  传值则会替代掉默认值
execute getmin(8899,9988);
查看公司文档 搜索默认值  也可以测试得出默认值  最后还可以查看存储过程源代码
select text  from user_source  where  name='GETMIN';

6、调用别人的存储过程 一般会先查看存储过程

desc    过程名;
desc    getmin;   
SQL> desc   getmin;
------------------------------------------------------------------------------------------
PROCEDURE getmin
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ------------        ----------- ------ --------
 VAR_X                          NUMBER                         IN     DEFAULT
 VAR_Y                          NUMBER                         IN     DEFAULT
 查看一个存储过程 可以获取 
 参数的名字
 参数的类型 
 参数的模式 
------------------------------------------------------------------------------------------

in    默认的   代表参数只负责给存储过程传入值
out   代表只给存储过程传出值 
in out   代表参数即给存储过程传入值  又给存储过程传出值 
 参数的默认值

 public static  void    getnum(int x){
     x=10001;
   }
  public static  void    getString(String x){
     x=x+"abc"
   }
  public  static  void  getStringBuf(StringBuffer  y){
    y.append("cba");
  }
  static  main(String[] args){
     String  x = new String ("nba");
     getString(x);
     x
     StringBuffer  y  = new StringBuffer("nba");
     getStringBuf(y);
     y
   }

7、参数的模式

 in      只负责给存储过程 传入参数值 
 create  or replace  procedure  getnum(var_x   number )
 is
 begin
       dbms_output.put_line(var_x);  
        var_x:=10001;
 end;
 /
 通过show errors  可以看到 var_x  只能读不能写 证明它只负责传入 不负责传出

 out  参数   只负责给存储过程 传出参数值 
 设计一个存储过程  有三个整数参数  打印前两个参数的最大值   并且把前两个参数的和存入第三个参数中 
 create  or replace  procedure  getmax_and_sum(var_x  number,var_y  number,
        var_z  out number)
 is
 begin
         if  var_x < var_y  then
               dbms_output.put_line(var_y);
         else
               dbms_output.put_line(var_x); 
         end   if;
         var_z:=var_x+var_y;
 end;
 / 
 注意:out 修饰的参数 必须是变量         
 declare
         var_z   number:=0;            
 begin
         getmax_and_sum(1,100,var_z);
         dbms_output.put_line(var_z);
 end;
 /

 in  out  参数   即负责给存储过程传入参数值  又负责传出值 
 设计一个存储过程  有两个整数参数  打印两个参数的最大值   并且把两个参数的和存入第二个参数中         
 create  or replace  procedure  getmax_and_sum(var_x  number,var_y  in  out   number)
 is
 begin
         if  var_x < var_y  then
               dbms_output.put_line(var_y);
         else
               dbms_output.put_line(var_x); 
         end   if;
         var_y:=var_x+var_y;
 end;
 /  

 按照参数的位置赋值
 declare
       var_t    number:=99;
 begin
       getmax_and_sum(100,var_t);
       dbms_output.put_line(var_t);
 end;
 / 

按照参数的名字赋值 
declare
       var_t    number:=99;
begin
       getmax_and_sum(var_y=>var_t,var_x=>100);
       dbms_output.put_line(var_t);
end;
/

8、设计一个存储过程 第一个参数代表从1 加到的数 第二个参数 用来存储前n项的和 调用这个存储过程 看计算是否正确

 create  or  replace  procedure   getNumN(var_n   number,var_sum  out  number)  
 is
 begin
         var_sum:=(1+var_n)*var_n/2;
 end;
 /
-----------------------------------------------------------------------------------------
declare
        var_s    number:=0;
begin
        getNumN(100,var_s);
        dbms_output.put_line(var_s);           
end;
 /