NOCOPY模式用于限定OUT模式和IN OUT模式在调用时是不是以传引用的方式进行。
默认情况下,OUT模式和IN OUT模式的参数是以传值的方式进行调用的。
IN模式总是以传引用的方式,如果用NOCOPY限制会报错。
传值就是将实参的值复制到形参。(因为复制,速度会没有传引用快)
传引用就意味着将实参的值的一个指针传递到相应的参数,形参改变实参也会立即被改变。(这些在C指针中讲的比较好)
--NOCOPY限制的OUT模式
create or replace procedure RaiseErrorCopy(
p_Raise in boolean,
p_ParameterA out nocopy number --将传值用NOCOPY限制为传引用
)as
begin
p_ParameterA:=7;
if p_Raise then
raise dup_val_on_index;
else
return;
end if;
end RaiseErrorCopy;
--测试效果
v_num:=1;
begin
DBMS_OUTPUT.PUT_LINE('Value before first call: '||v_num);
RaiseErrorCopy(FALSE,v_num);
DBMS_OUTPUT.PUT_LINE('Value after sucessful call: '||v_num);
DBMS_OUTPUT.PUT_LINE('');
v_num:=2;
DBMS_OUTPUT.PUT_LINE('Value before second call: '||v_num);
RaiseErrorCopy(True,v_num);
exception
when others then
DBMS_OUTPUT.PUT_LINE('Value after unsucessful call: '||v_num);
end;
Value before first call: 1
Value after sucessful call: 7
Value before second call:2
Value after unsucessful call:7 --即使没有完全成功,但是实参值也因形参改变而立即改变了
Value before first call: 1
Value after sucessful call: 7
Value before second call:2
Value after unsucessful call:2 --只有当程序正常结束时,赋给OUT或者IN OUT类型参数的值才会返回
NOCOPY的主要优点是它可以提高程序性能。传递大型数组的时候,这一点尤为突出
当我们声明一个参数是IN类型时,进行传参是将传给该参数一个实参的指针;
当我们声明一个参数是OUT或者IN OUT类型时,进行传参是将传给该参数一个实参的拷贝;
只有当程序正常结束时,赋给OUT或者IN OUT类型参数的值才会返回(除非使用了NOCOPY)。
将NOCOPY应用在传递数据量很大的参数(such as collections, records, and instances of object types)时,可起到优化性能的作用。
当参数是OUT或者IN OUT类型时:没有NOCOPY=按值传递(ByVal);加上NOCOPY=按引用传递(ByRef)
http://blog.csdn.net/kkdelta/article/details/4698399
http://www.cnblogs.com/qianwen/p/3769665.html
PL/SQL Programming Scott Urman