说明:将NOCOPY应用在传递数据量很大的参数
(such as collections, records, andinstancesofobjecttypes)时,可起到优化性能的作用。当参数是OUT或者IN OUT类型时:没有NOCOPY=按值传递(ByVal);加上NOCOPY=按引用传递(ByRef)。
NOCOPY模式用于限定OUT模式在调用时是不是以传引用的方式进行(它只是一个编译器暗示,不一定总是起作用),
默认情况下,OUT模式的参数是以传值的方式进行调用的.NOCOPY是传引用,会在赋值的时候立即生效 ,如果在返回之前发生异常,实际参数的值也会被改变.
编译器可以决定是否执行该项。在下列情况下,编译器将忽略NOCOPY项:
1.实参是索引表(index-bytable)的成员时。如果该实参是全表,则该限制不起作用。
2.实参被强制指定精度,比例或NOT NULL时。该限制将不适用按最大长度强制的字符串参数。
3.实参和形参都是记录类型,二者是以隐含方式或使用了%ROWTYPE类型声明时,作用在对应字段的强制说明不一致。
4.传递实参需要隐式类型转换时。
5.子程序涉及到远程过程调用(PRC)。远程过程调用就是跨越数据库对远程服务器的过程调用
DECLARE
l_1 NUMBER := 10;
l_2 NUMBER := 20;
l_3 NUMBER := 30;
PROCEDURE test_out(p1 INNUMBER,
x1 INOUTNUMBER,
x2 INOUTNOCOPYNUMBER) IS
BEGIN
x1 := p1;
dbms_output.put_line('inside test_out, x1=' || x1);
x2 := p1;
dbms_output.put_line('inside test_out, x2=' || x2);
raise_application_error(-20001, 'test NOCOPY');
END;
BEGIN
dbms_output.put_line('before, l_1=' || l_1 || ', l_2=' || l_2 ||
', l_3=' || l_3);
BEGIN
test_out(l_1, l_2, l_3);
EXCEPTION
WHENOTHERSTHEN
dbms_output.put_line('SQLCODE => ' || SQLCODE || ', SQLERRM => ' ||
SQLERRM);
END;
dbms_output.put_line('after, l_1=' || l_1 || ', l_2=' || l_2 || ', l_3=' || l_3);
END;
/*结果*/
before, l_1=10, l_2=20, l_3=30
inside test_out, x1=10
inside test_out, x2=10
SQLCODE => -20001, SQLERRM => ORA-20001: testNOCOPY
after, l_1=10, l_2=20, l_3=10