NOCOPY

本文详细解读了NOCOPY在处理大量数据参数时如何优化性能,特别针对OUT或IN OUT类型的参数,阐述了NOCOPY模式在参数传递方式上的差异与效果。同时,列举实例演示NOCOPY的应用场景及限制条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:将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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值