oracle 带out参数的存储过程的创建与调用

–oracle 带out参数的存储过程的创建与调用 今天刚接触了oracle存储过程中的参数,对于out与in out 这两种形式的参数类型,我比较困惑。在此尝试去理清楚一下。 在测试的过程中,我发现是自己想复杂了。 proc的参数有三种形式,in / out / in out 。(1)in 形式的可以接受存储过程调用时传入的参数。若存储过程定义过程中给出了参数值,则实参接收的赋值的优先顺序为:存储过程内>存储过程外的调用值。(2)out形式的不可以接受存储过程调用时传入的参数,只接受在存储过程内对其的赋值。最重要的是,其值不接受存储过程之外对它的赋值。当存储过程经过调用后,实参值会根据形式值发生改变。[调用完后可以实参值可更改](3)那in out 形式的参数故名思意就是结合这两者的特点。 不用想太复杂了……

create or replace procedure p_test
(i_in in integer , 
e_name   OUT VARCHAR2, 
c_NAME   OUT VARCHAR2) 
is 
begin 
  e_name := e;
   insert into test2 values (i_in,e_name ,c_NAME);  
   COMMIT;
end;
declare 
  v_id integer; v_e_name varchar2(100);v_c_name varchar2(100);
begin 
  v_id := 1002;
  v_e_name := outer proc;
  v_c_name := cccc;    
  delete from test2 ;  commit;  
  delete from test4 ;  commit;   
  
  insert into test4 select before p_test --:||v_e_name, before p_test --:||v_c_name ,v_id       from dual ;   
  commit;
  
  p_test(v_id,v_e_name,v_c_name);  
  
  insert into test4 select when p_test --:||v_e_name, when p_test --:||v_c_name ,v_id       from dual ;
  commit;
  
  
  v_id := 1003;
  v_e_name := proc!!;
  v_c_name := cccc!!!;  
    
  insert into test4 select after charge --:||v_e_name, after charge --:||v_c_name ,v_id       from dual ;
  commit;  
  
end;

从这两个表的结果就可以验证以上的说法啦。

select * from test2;  
select * from test4;

接下来我们将out型的参数改为in out 型。其他语句不变。

create or replace procedure p_test
(i_in in integer , 
e_name  in  OUT VARCHAR2, 
c_NAME  in  OUT VARCHAR2) 
is 
begin 
  e_name := e;
   insert into test2 values (i_in,e_name ,c_NAME);  
   COMMIT;
end;

![在这里插入图片描述](https://img-blog.img.cn/20191117021005231.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE1NDAzODYz,size_16,color_FFFFFF,t_70

经验分享 程序员 微信小程序 职场和发展