以传值和传引用的方式传递参数 IN OUT NOCOPY
来源:互联网 发布:雨佳会计软件 编辑:程序博客网 时间:2024/06/17 15:37
传递子程序参数的方式有两种--传值和传引用。当以引用的方式传递参数的时候,就将指向实际参数的一个指针传递到相应的形式参数。另一方面,当以传值的方式传递参数的时候,就将实际参数的值复制到相应的形式参数。以引用的方式传递参数通常会更快,因为它避免了复制。对集合类型的参数而言,这表现更加明显,因为集合类型的数据一般都非常多。
默认情况下,PL/SQL对IN参数都使用传引用的方式,而对IN OUT和OUT参数都使用传值的方式。
1)NOCOPY的使用方法
parameter_name [mode] NOCOPY datatype
其中parameter_name是参数的名称,mode是参数模式,而datatype是参数类型。如果有NOCOPY,PL/SQL编译器就会尝试通过传引用的方式传递参数,而不是通过传值方式传递参数。注意,NOCPY只是一个编译器提示,而不是编译器命令,因此,这种提示并不一定总会被接受。
-- This procedure demonstrates the syntax of the NOCOPY compiler-- hint.CREATE OR REPLACE PROCEDURE NoCopyTest ( p_InParameter IN NUMBER, p_OutParameter OUT NOCOPY VARCHAR2, p_InOutParameter IN OUT NOCOPY CHAR) ISBEGIN NULL;END NoCopyTest;/
在IN参数上使用NOCOPY时,会引发一个编译错误,因为IN参数总是以传引用方式传递参数的,因此不允许使用编译器提示NOCOPY。
2)带NOCOPY的异常语义
以传递引用的方式传递参数的时候,对形式参数所做的任何更改都会同时反应到实际参数上,因为这二者指向的是同一个位置。这也意味着,如果过程在形式参数的值发生了变化以后,又以一个未处理的异常结束,那么实际参数的原始值也会丢失。
CREATE OR REPLACE PROCEDURE RaiseErrorNoCopy ( p_Raise IN BOOLEAN, p_ParameterA OUT NOCOPY NUMBER) ASBEGIN p_ParameterA := 7; IF p_Raise THEN RAISE DUP_VAL_ON_INDEX; ELSE RETURN; END IF;END RaiseErrorNoCopy;/DECLARE v_Num NUMBER := 1;BEGIN DBMS_OUTPUT.PUT_LINE('Value before first call: ' || v_Num); RaiseErrorNoCopy(FALSE, v_Num); DBMS_OUTPUT.PUT_LINE('Value after successful call: ' || v_Num); DBMS_OUTPUT.PUT_LINE(''); v_Num := 2; DBMS_OUTPUT.PUT_LINE('Value before second call: ' || v_Num); RaiseErrorNoCopy(TRUE, v_Num);EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Value after unsuccessful call: ' || v_Num);END;/--结果如下Value before first call:1Value after successful call:7Value before second call:2Value after unsuccessful call:7
我们可以看到,即使发生了异常,还是两次修改了实际参数的值。
3)使用NOCOPY的一些限制
在某些情况下,编译器会忽略NOCOPY的存在,参数仍然以传值的方式进行传递,而且也不会产生任何错误。记住,NOCOPY只是一种pragma,编译器没有责任完全遵守这个提示。在下面几种情形中,会忽略NOCOPY的存在:
- 实际参数是联合数组的一个成员。但是,如果实际参数是整个数组,就不受这种约束的限制。
- 使用长度、精度或NOT NULL约束限制的实际参数。
- 实际参数和形式参数都是记录,并且它们要么被隐式声明为一个循环变量,要么是使用%ROWTYPE进行声明的,而且相应字段上的约束又不同。
- 传递的实际参数需要进行隐式的数据类型转换。
- 子程序被包含在进行远程过程调用(remote procedures call,RPC)中。
- 以传值和传引用的方式传递参数 IN OUT NOCOPY
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- Oracle 子程序参数模式,IN,OUT,NOCOPY
- Oracle 子程序参数模式,IN,OUT,NOCOPY
- IN OUT NOCOPY 分析
- 以引用的方式传递参数避免对象切割
- 值传递和引用传递-----函数参数传递的两种方式
- 函数的传参方式有值传递和地址传递,地址传递又分为指针传递和引用传递。
- 参数的值传递,指针传递和引用传递
- Java的参数传递有值传递和引用传递
- python 中参数传递 * 和 ** 的问题,以 tuple和dict方式传递参数
- java函数方法参数传递方式机制-值传递还是引用传递(传值或传引用)
- C++中两种参数传递方式 :值传递和传指针
- C++ 参数传递方式:值传递,引用传递,指针传递
- Oracle PL/SQL之IN OUT NOCOPY
- Differences between "in"/"out" and "nocopy"
- Oracle 指定子程序 OUT 或 IN OUT 参数为引用传递
- 通过ASP远程注册自己的组件
- 使用TCPDF插件生成pdf以及pdf的中文处理
- 在asp.net中使用excel模板
- 查看软件使用的端口
- 后台技术分享
- 以传值和传引用的方式传递参数 IN OUT NOCOPY
- 为DataGrid 写一个 DropDownListColumn
- gnuplot学习(二)
- DataReader也玩超酷数据显示分页
- linux下添加PATH环境变量
- sqlserver通配符使用-特殊符号处理-escape
- 大概了解一下web.config
- ASP.NET: Dispaly data from an Excel Spreadsheet
- 用service来进行查询