首页 > 数据库 > Oracle > plsql中nocopy参数说明
当参数是OUT或者IN OUT类型时:没有NOCOPY=按值传递(ByVal);加上NOCOPY=按引用传递(ByRef)。
[@more@]当我们声明一个参数是IN类型时,进行传参是将传给该参数一个实参的指针;
当我们声明一个参数是OUT或者IN OUT类型时,进行传参是将传给该参数一个实参的拷贝;
只有当程序正常结束时,赋给OUT或者IN OUT类型参数的值才会返回(除非使用了NOCOPY)。
将NOCOPY应用在传递数据量很大的参数(如:集合、记录、对象类型)时,可起到优化性能的作用。
当参数是OUT或者IN OUT类型时:没有NOCOPY=按值传递(ByVal);加上NOCOPY=按引用传递(ByRef)。
当外部指定的out参数已经有一个值,在调用函数时出现了异常,此时plsql将返回该参数原来的值,而不是在函数处理过程中的某个值。
以上是没有指定nocopy的情况,当指定了该参数时,plsql将不会增加这些处理,因此外部指定的out参数将是函数执行过程中的某个值。
1、使用nocopy的情况:
declare
v_num number := 2011;
procedure sp_test_nocopy(o_num out nocopy number) as
begin
o_num := 2012;
raise_application_error(-20002, '使用nocopy');
end sp_test_nocopy;
begin
begin
sp_test_nocopy(v_num);
exception when others then
dbms_output.put_line(v_num);
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
end;
end;
执行输出:
2012
-20002
ORA-2002: 使用nocopy
2、未用nocopy的情况:
declare
v_num number := 2011;
procedure sp_test_nocopy(o_num out /*nocopy*/ number)as
begin
o_num := 2012;
raise_application_error(-20002, '未用nocopy');
end sp_test_nocopy;
begin
begin
sp_test_nocopy(v_num);
exception when others then
dbms_output.put_line(v_num);
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
end;
end;
执行输出:
2011
-20002
ORA-2002: 未用nocopy
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28797258/viewspace-1129163/ ,如需转载,请注明出处,否则将追究法律责任。