ITPub博客

首页 > 数据库 > Oracle > Oracle Procedure参数类型

Oracle Procedure参数类型

Oracle 作者:牛肉面之歌 时间:2014-08-23 12:09:32 0 删除 编辑

一.实参与形参

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

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

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

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

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

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

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

IN OUT:此模式是IN和OUT的结合。当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时,需使用自治事务),可以考慮OUT或IN OUT。

Oracle Procedure 參數传递方式

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

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

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

依预设,PL/SQL会以传址方式传递IN参数,以传值方式传递OUT和IN 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参数。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29424472/viewspace-1256428/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORACLE的NLS_LANGUAGE
下一篇: ORACLE索引的管理
请登录后发表评论 登录
全部评论

注册时间:2014-01-04

  • 博文量
    76
  • 访问量
    115107