PL/SQL NOCOPY限制模式
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 --即使没有完全成功,但是实参值也因形参改变而立即改变了
如果没有NOCOPY限制。结果将会是:
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