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
beginp_ParameterA:=7;if p_Raise thenraise dup_val_on_index;elsereturn;end if;
end RaiseErrorCopy;--测试效果

v_num:=1;
beginDBMS_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);exceptionwhen others thenDBMS_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

转载于:https://www.cnblogs.com/qianwen/p/3769815.html

PL/SQL NOCOPY限制模式相关推荐

  1. 金仓数据库KingbaseES数据库开发指南(4. 面向应用程序的PL/SQL开发)

    目录 4.1. PL/SQL子程序和包的编写 ¶ 4.1.1. PL/SQL 子程序概述 ¶ 4.1.2. PL/SQL 包概述 ¶ 4.1.3. PL/SQL 单元概述 ¶ 4.1.4. 创建 PL ...

  2. Oracle 12c中增强的PL/SQL功能

    英文链接:http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53plsql-1999801.html Oracle 12c增强了 ...

  3. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  4. sql如何遍历几百万的表_Oracle PL/SQL调优技巧分享

    原创作者:如人饮水冷暖自知 责任编辑:AcDante 前言 开门见山,今天和大家聊聊如何对PL/SQL代码进行优化,以及如何编写高效的PL/SQL代码,如果您是开发DBA,或者您是数据库开 发人员,对 ...

  5. PL/SQL详细介绍

    PL/SQL笔记 PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DD ...

  6. oracle pl/sql 基础

    PL/SQL笔记 PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DD ...

  7. PL/SQL Developer(解压版)连接64位的Oracle11g

    PL/SQL Developer(解压版)连接64位的Oracle11g 在Windows 64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时要用P ...

  8. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  9. PL/SQL程序设计 第七章 包的创建和应用

    §7.1  引言 包是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装.包类似于C++和JAVA语言中的 ...

最新文章

  1. Linux命令基础6-mkdir命令
  2. 负载均衡中的服务器健康检查
  3. 如何在GridView中使用DataFromatString [转]
  4. (~最新合集~)计算机网络谢希仁第七版 第五章课后答案
  5. 说说 C# 9 新特性的实际运用
  6. P3938 斐波那契
  7. 测试功能范围_软件测试难学吗?
  8. c语言的运算符有那哪些,c语言逻辑运算符有哪些
  9. 小白新手web开发简单总结(三)-一个简单的Web开发项目
  10. Android术语查询软件,术语在线app_术语在线查询_学术术语在线-多特软件站安卓网...
  11. 基于N-gram的双向最大匹配中文分词
  12. 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)
  13. TPM分析笔记(一) TPM历史
  14. css border实现图形
  15. Java中三种代理方式—— 静态代理与两种动态代理的实现机制
  16. sqlserver 日期比较
  17. unity5.x游戏开发指南——4、5、6章
  18. vue+element上传图片到阿里云(可直接运行domo)
  19. 利用EL表达式替换回车符
  20. Verilog实现Bresenham任意斜率直线

热门文章

  1. url中 斜杠如何传输_如何在父子页面中传输数据(layer)
  2. Java笔记-模拟QQ三方登录(单点登录2.0)
  3. Flask笔记-session安全问题(避免任务重复提交)
  4. C++设计模式-面向对象程序设计要点以及封装性特点
  5. cholesky分解java代码_Cholesky 分解(转)
  6. r语言 线性回归 相关系数_基于R语言的lmer混合线性回归模型
  7. MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)
  8. 第一章:Python的基本数据类型-第三节:Python中表示“无序”的数据类型
  9. (王道408考研操作系统)第二章进程管理-第三节1:进程同步与互斥的基本概念
  10. 基础编程题之最大连续bit数(位运算)