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

 

posted @ 2014-06-05 10:39  北门吹风  阅读(444)  评论(0编辑  收藏  举报