首先看下 IN参数,用于接收参数,在子程序内部,不能进行修改。当参数没有写模式的时候,默认的参数模式:IN
v_b number,没有声明 IN、OUT、IN OUT,所以默认为 IN,IN参数,则v_b 不能再子程序内部修改值。
OUT参数,输出模式的参数,用于输出值,会忽略传入的值。在子程序内部可以对其进行修改。
存储过程如下:
create or replace procedure p(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
dbms_output.put_line('v_ret---'||v_ret);--此处拿不到 v_ret的值
v_ret := 100;--OUT 参数可以在子程序中赋值
dbms_output.put_line('v_ret---'||v_ret);
if(v_a>v_b) then
v_ret := v_a;
else
v_ret :=v_b;
end if;
v_temp := v_temp+1;
end;
执行存储过程:
declare
v_a number:=1;
v_b number:=2;
v_ret number :=1;
v_temp number :=5;
begin
p(v_a,v_b,v_ret ,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end;
结果:对于OUT参数v_ret,调用的时候传入的是 1 ,但是在程序中第一次拿入参v_ret的值为空,说明OUT参数拿不到入参的值,
但是可以在程序中对其进行赋值。
IN OUT参数,能接收传入的实参值;在子程序内部可以修改,可以输出
存储过程如下:
create or replace procedure p(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
dbms_output.put_line('v_temp---'||v_temp);--对于 IN OUT 参数,此处能拿到值
v_temp := 100;--IN OUT 参数除了可以拿到入参的值,也可以在子程序中赋值
dbms_output.put_line('v_temp---'||v_temp);
if(v_a>v_b) then
v_ret := v_a;
else
v_ret :=v_b;
end if;
v_temp := v_temp+1;
end;
执行存储过程:
declare
v_a number:=1;
v_b number:=2;
v_ret number :=1;
v_temp number :=5;
begin
p(v_a,v_b,v_ret ,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end;
结果: