PLSQL子程序参数模式

创建过程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执行按值传递。
当参数是按引用传递时,一个指向实参的指针(存储位置)将被传递到对应的形参。当参数是按值传递时,实参的值将被赋予对应的形参。按引用传递的效率要比按值传递的效率要高,这是因为按引用传递不涉及复制操作。按引用传递特别适合于处理集合类型参数,如表,数组等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值