[Oracle整理]Oracle之Procedure参数类型
说明:本内容是工作用到的知识点整理,来自工作中和网络。
代码于Oracle9上测试。
OracleProcedure参数类型
一.实参与形参
形参:在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 |
2 TestScript
declare |
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参数。