[Oracle整理]Oracle之Procedure参数类型

说明:本内容是工作用到的知识点整理,来自工作中和网络。
代码于Oracle9上测试。

 

OracleProcedure参数类型

一.实参与形参

形参:procedure定义的时候,宣告的参数

实参:在引用procedure的时候,从外部传入(出)的参数

形参是实参值的预留位置,实参的值是被用在procedure中的值。

在程序内,实参会借由形参来参照,当程序传回时,形参的值会被指定给实参。

二.形参的三种模式(IN OUTIN OUT

IN当程序被呼叫时,实参的值会被传入procedure中。 在程序内部,形参就像PL/SQL常数一样,是只读的,不能更改。当程序结束,且控制权传回给进行呼叫的环境时,实参值不会被改变。

OUTprocedure被呼叫时,任何实参的值都会被忽略。在procedure内,形参就像是未被初始化PL/SQL参数,因此具有NULL值。它可以被读取写入。当procedure结束且控制权交给进行呼叫的环境时,形参内容就会被指定给实参。

IN OUT此模式是INOUT的结合。当procedure被呼叫时,实参值被传递到procedure内。在procedure内,形参就像是已经被初始化的变量,可以被读取写入。当procedure结束且控制权传回给呼叫的环境时,形参的内容就会被指定给实参。

三.测试

测试OUT

1 Create Procedure

create or replace procedure putNum(P_Date in date, P_year out varchar2) is
  v_num  number(8) := 1;
  v_days number;
  v_date date;
begin
  dbms_output.put_line('intput value:' || P_year);
  v_num  := 1;
  v_days := 1;
  v_days := to_number(to_char(P_Date, 'dd')); -- to_char(sysdate-20,'dd')
  for i in 1 .. v_days Loop
    v_date := to_date('2011/11/' || to_char(i), 'yyyy/MM/dd');
    --dbms_output.put_line(v_date);
  end loop;
  P_year := '2012';
end;

2 TestScript

declare
  v_yy varchar2(4);
begin
  v_yy := '2010';
  putnum(sysdate, v_yy);
  dbms_output.put_line('Output value:' || v_yy);
end;

3 执行结果

4 分析

使用in传入参数,实参的值被忽略——不会使用传入参数的值。所以输入为空。形参的值是NULL。编译器认为没初始化。

测试IN OUT

1 上面的putNum(P_Date in date, P_year out varchar2) is 改为:

putNum(P_Date in date, P_year in out varchar2) is

2 输出结果

四.总结

1 形参的三种模式:in , out, in out。默认是in

2 一个函数需要返回一个值并且需要DML时(commit时,需使用自治事务),可以考慮OUTIN OUT

Oracle Procedure 參數传递方式

以传址和传值方式传递参数

当参数是以传址(By Reference)方式传递时,指向实参的指针就会被传递给相对应的形参。

当参数是以传值(By Value)方式传递时,它就会从实参复制到形参中。

预设PL/SQL会以传址方式传递IN参数,以传值方式传递OUTIN OUT参数。

使用NOCOPY编译器指示:

语法:procedure procedure_name (parameter_name [mode] NOCOPY datatype)

说明:parameter_name---->参数名称

mode                 ----->参数模式(IN / OUT / IN OUT

datatype           ------>参数的数据类型

NOCOPY         ------->NOcopy出现,PL/SQL编译器就会尝试传地址方式来传递参数,而不是用传值的方式。

限制:

在某些情况下,NOCOPY会被忽略,而参数还是会以传值的方式传递。

在这些情况下,不会有错误产生。

请记住,NOCOPY是个指示,编译器没义务遵循它。

在以下情况会被忽略:

1.实参是组合阵列的成员。当实参为这个阵列时,此限制条件不适用

2.实参被精确度准确度、或者NOT NULL限制条件所限制时。但是此限制对于由最大长度所限制的字元参数不适用。

3.实参和形参都是记录,且它们是被内隐的作为循环控制的变量,或者是使用%ROWTYPE来宣告,在对应栏位上的限制不同。

4.传递实参需要有内隐的数据类型转换

5.副程式牵涉到远端程序呼叫RPC)。由于参数必须在网络上传递,所以要用传址方式来传递它们是不可能的。

效能:

在所需时间上,以传值方式传递IN OUT参数,会远远大于以传址方式传递IN IN OUT NOCOPY参数。

posted @ 2012-02-11 15:38  yellowwood  阅读(9006)  评论(0编辑  收藏  举报
Never Give UP