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