一、什么是存储过程?
        在Oracle数据库中,可以将一些固定的操作集中起来由Oracle数据库服务器来完成,以实现某个任务,这就是存储过程。
二、存储过程有什么优点?
        1、简化复杂操作;
        2、增加数据独立性;
        3、提高安全性;
        4、实现表字段完整性;
三、存储过程的参数
    1、存储过程的参数有三种:in(输入类型)  参数,out(输出类型)参数,in out(输入、输出类型)参数。在过程中可以定义参数,在调用该过程时,可以向过程传递实际参数。如果没有参数,则过程名后面的圆括号和参数可以省略。参数定义形式如下:
                                参数名(参数定义)      参数传递模式        参数数据类型:=默认值
                                        flag                            in out                    number:=0
    2、三种参数传递模式比较:
                                                      in                                                out                                           in  out
               是否默认                      默认                                     必须明确指定                                 必须明确指定
               参数的传递方向          从调用者到过程                   从过程到调用者                                两个方向
               形式参数的作用          一个常量                              没有初始化的变量                             经过初始化的变量
               实际参数的形式          常量、表达式、变量           必须是一个变量                                 必须是一个变量
        参数默认值的作用是在调用过程时,如果没有提供实际的参数,则将此默认值作为实际的参数传递给过程。数据类型用来指定参数的类型,在参数定义中不能指定参数的约束条件,即不能指定参数的长度和是否为空 等属性。
四、存储过程中参数的赋值:
    declare   变量名:=变量值
    declare    flag:=0;
五、存储过程的创建:
    在PL/SQL语句中,可以使用create or replace procedure命令创建用户自定义的存储过程。存储过程包括无参存储过程以及有各种参数的存储过程,形式如下:
       create or replace procedure  pro_test/pro_test(参数1,参数2,...) as    
      begin
      存储过程定义
      end     pro_test;
六、执行存储过程:
    1、执行无参数的存储过程:
        begin
        存储过程名;
        end ;
    2、执行带有in参数的存储过程:
        begin
        存储过程名(in参数1,in参数2,...);
        end;
    3、执行带有in,out参数的存储过程:

declare count1 number;//out参数1 
 

     count2 number;//out参数2 

 

          begin 

 
pro_admin_inse(in参数1,in参数2,...,count1,count2,...);//执行存储过程 

 
dbms_output.put_line(count1||count2||...);//输出out参数 

 
end; 
 
    4、执行带哟偶in out参数的存储过程:
          
 declare flag1 number:=2; 
     flag2 number:=3; 

 
begin 

 
exch(flag1,flag2); 

 
dbms_output.put_line(flag1||flag2); 

 
 
 end;


七、查询存储过程:
     

select * from user_objects where object_name=upper('pro_send');
 
select * from user_source where name=upper('pro_send'); //查询存储过程的详细信息 

 
 
 select * from user_errors where name=upper('pro_send');//查询存储过程的错误信息

八、删除存储过程:
        drop   procedure  存储过程名或者直接从PL/SQL中删除。
九、存储过程示例:

1 
 、用存储过程输出“Hello world!”
 
create or replace procedure  pro_send as 

 
begin 

 
dbms_output.put_line("Hello world!"); 

 
end pro_send; 

 

      2、更新某张表的某个字段的值: 

 
create or replace procedure  pro_edit as 

 
begin 

 
update table_name t set t.name="唐飞" where t.id="1"; 

 
end pro_edit; 

 

      3、向某张表中根据条件插入数据(只有in参数): 

 
create or replace procedure pro_admin_inse(ire_cityId in varchar2,ire_cityName in varchar2) as 

 
begin 

 
declare max_ire_id number; 

 
    begin 

 
    if(ire_cityName is null or length(ire_cityName) = 0) then 

 
    return; 

 
    end if; 

 
    if(ire_cityId != 888) then 

 
    return; 

 
    end if; 

 
    select max(i.id) into max_ire_id from IRE_CITY i; 

 
    insert into IRE_CITY(id,city_id,city_name) values(max_ire_id+1,ire_cityId,ire_cityName); 

 
    end; 

 
end pro_admin_inse; 

 

      4、利用if...else语句更新表中的数据: 

 
create or replace procedure pro_ire_city(ire_id in number:=11,ire_cityName in varchar2) as 

 
begin 

 
    if ire_id = 11 then  

 
        update IRE_CITY set city_id = city_id + ire_id; 

 
    else 

 
update IRE_CITY set city_id = city_id + ire_id where city_name = ire_cityName; 

 
    end if; 

 

          end pro_ire_city; 

 

      5、向某张表中根据条件插入数据(有in和out参数): 

 
create or replace procedure pro_admin_inse(ire_cityId in varchar2,ire_cityName in varchar2,ire_count1 out number,ire_count2 out     number) as 

 
begin 

 
declare max_ire_id number; 

 
    begin 

 
    if(ire_cityName is null or length(ire_cityName) = 0) then 

 
        return; 

 
    end if; 

 
    if(ire_cityId != 888) then 

 
return; 

 
    end if; 

 
    select count(*) into ire_count1 from IRE_CITY; 

 
    select max(i.id) into max_ire_id from IRE_CITY i; 

 
    insert into IRE_CITY(id,city_id,city_name) values(max_ire_id+1,ire_cityId,ire_cityName); 

 
    select count(*) into ire_count2 from IRE_CITY; 

 
    end; 

 
end pro_admin_inse; 

 

      6、把in out参数的两个值互换值 

 
create or replace procedure exch(flag1 in out number,flag2 in out number) as 

 
begin 

 
    flag1 := flag1 + flag2; 

 
    flag2 := flag1 - flag2; 

 
    flag1 := flag1 - flag2; 

 
 
 end;