创建过程ModeTest,代码如下(Code 1):
create or replace procedure ModeTest(p_InParameter in number,
p_OutParameter out number,
p_InOutParameter in out number) is
v_LocalVariable number := 0;
begin
--初始值
dbms_output.put_line('Inside ModeTest:');
if (p_InParameter is null) then
dbms_output.put_line('p_InParameter is Null');
else
dbms_output.put_line('p_InParameter =' || p_InParameter);
end if;
if (p_OutParameter is null) then
dbms_output.put_line('p_OutParameter is Null');
else
dbms_output.put_line('p_OutParameter =' || p_OutParameter);
end if;
if (p_InOutParameter is null) then
dbms_output.put_line('p_InOutParameter is Null');
else
dbms_output.put_line('p_InOutParameter =' || p_InOutParameter);
end if;
v_LocalVariable := p_InParameter;
p_OutParameter := 7;
v_LocalVariable := p_OutParameter;
v_LocalVariable := p_InOutParameter;
p_InOutParameter := 8;
--最终值
dbms_output.put_line('At end of ModeTest:');
if (p_InParameter is null) then
dbms_output.put_line('p_InParameter is Null');
else
dbms_output.put_line('p_InParameter =' || p_InParameter);
end if;
if (p_OutParameter is null) then
dbms_output.put_line('p_OutParameter is Null');
else
dbms_output.put_line('p_OutParameter =' || p_OutParameter);
end if;
if (p_InOutParameter is null) then
dbms_output.put_line('p_InOutParameter is Null');
else
dbms_output.put_line('p_InOutParameter =' || p_InOutParameter);
end if;
end ModeTest;
对过程的调用为(Code 2):
declare
v_INPARAMETER NUMBER := 1;
v_OUTPARAMETER NUMBER := 2;
v_INOUTPARAMETER NUMBER := 3;
begin
dbms_output.put_line('Before calling ModeTest');
dbms_output.put_line('v_INPARAMETER=' || v_INPARAMETER ||
' v_OUTPARAMETER=' || v_OUTPARAMETER ||
' v_INOUTPARAMETER=' || v_INOUTPARAMETER);
modetest(p_inparameter => v_inparameter,
p_outparameter => v_outparameter,
p_inoutparameter => v_inoutparameter);
dbms_output.put_line('After calling ModeTest');
dbms_output.put_line('v_INPARAMETER=' || v_INPARAMETER ||
' v_OUTPARAMETER=' || v_OUTPARAMETER ||
' v_INOUTPARAMETER=' ||
v_INOUTPARAMETER);
end;
1、形参和实参?
Code 1 中p_InParameter、p_OutParameter、p_InOutParameter为形参,只是形式上代表过程ModeTest的参数。
Code 2 中v_INPARAMETER、v_OUTPARAMETER、v_INOUTPARAMETER为实参,作为参数传递给过程ModeTest,实参包含了过程被调用时传来的值。
2、形参的三种模式?
In、Out和In Out。
In具有只读属性,过程中不能对其赋值和改变。
Out模式下的形参在过程内部,其值为NULL,具有读写属性,过程结束后,形参的值将传递给实参。
In Out 模式下形参在过程内部,相当于初始化的变量,并具有读写属性,过程结束时,形参的内容将传递给实参。
对应于参数IN OUT或O U T的实参必须是变量,而不能是常数或表达式。也就是说,程序必须提供返回的变量的存储位置。我们可以在调用过程ModeTest时用直接量来取代变量v_IN,例如ModeTest(1, v_OUT, v_INOUT);
3、按引用传递和按值传递?
PLSQL的默认方式是对参数I N进行按引用传递,而对参数OUT,IN OUT执行按值传递。
当参数是按引用传递时,一个指向实参的指针(存储位置)将被传递到对应的形参。当参数是按值传递时,实参的值将被赋予对应的形参。按引用传递的效率要比按值传递的效率要高,这是因为按引用传递不涉及复制操作。按引用传递特别适合于处理集合类型参数,如表,数组等。