众所周知,在声明子程序时,可以将NOCOPY关键字冠之于IN及IN OUT参数,以使得子程序调用时,改变默认的传参方式(按值传递),使用按地址传递的方式,这在处理数据量较大的参数时(如大的集合类型变量)比较有效,能显著提高PL/SQL程序的运行性能。但NOCOPY并非指令,它只是一个编译提示(hint),在下列这些情况下这个提示将会无效:
- 当实参是关联数组(associative array)的一个元素时。若实参是一个完整的关联数组,NOCOPY有效(NOCOPY就是用来处理这些大的集合类型的)。
- 当实参对应的数据类型有约束时,比如定义实参变量时使用了NOT NULL关键字,NUMBER变量定义了SCALE等。不过,实参若是长度受限的字符串,或实参只是元素或属性有约束的组合类型(集合类型、对象类型),则NOCOPY却是有效的。
- 当实参与形参都是记录类型,然而其中一个或两个使用了%TYPE或%ROWTYPE来声明,并且某些对应字段有不同的约束时。
- 当实参与形参都是记录类型,实参是游标FOR循环的索引变量(实质也是一个%ROWTYPE记录类型变量),并且实参与形参的某些对应字段有不同的约束时。
- 当实参向形参传递需要做隐式的数据类型转换时。
- 当通过一个数据库链接(database link)来调用一个子程序时,或者被调用的子程序是一个外部存储过程。外部存储过程指的是非PL/SQL语言(C,JAVA...)定义的子程序或类方法,通过CREATE PROCEDURE...AS LANGUAGE...NAME...将其引入ORACLE中来使用。