PL/SQL之存储过程

一、什么是存储过程?
        在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;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值