NOCOPY之使用限制

 众所周知,在声明子程序时,可以将NOCOPY关键字冠之于IN及IN OUT参数,以使得子程序调用时,改变默认的传参方式(按值传递),使用按地址传递的方式,这在处理数据量较大的参数时(如大的集合类型变量)比较有效,能显著提高PL/SQL程序的运行性能。但NOCOPY并非指令,它只是一个编译提示(hint),在下列这些情况下这个提示将会无效:
  1. 当实参是关联数组(associative array)的一个元素时。若实参是一个完整的关联数组,NOCOPY有效(NOCOPY就是用来处理这些大的集合类型的)。
  2. 当实参对应的数据类型有约束时,比如定义实参变量时使用了NOT NULL关键字,NUMBER变量定义了SCALE等。不过,实参若是长度受限的字符串,或实参只是元素或属性有约束的组合类型(集合类型、对象类型),则NOCOPY却是有效的。
  3. 当实参与形参都是记录类型,然而其中一个或两个使用了%TYPE或%ROWTYPE来声明,并且某些对应字段有不同的约束时。
  4. 当实参与形参都是记录类型,实参是游标FOR循环的索引变量(实质也是一个%ROWTYPE记录类型变量),并且实参与形参的某些对应字段有不同的约束时。
  5. 当实参向形参传递需要做隐式的数据类型转换时。
  6. 当通过一个数据库链接(database link)来调用一个子程序时,或者被调用的子程序是一个外部存储过程。外部存储过程指的是非PL/SQL语言(C,JAVA...)定义的子程序或类方法,通过CREATE PROCEDURE...AS LANGUAGE...NAME...将其引入ORACLE中来使用。
示例 1:使用 NOCOPY 子句插入拔出的 PDB alter pluggable database pdb2 close immediate; alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml'; drop pluggable database pdb2 keep datafiles; create pluggable database pdb2 using '/home/oracle/pdb2.xml' nocopy tempfile reuse; 示例 2:使用 AS CLONE 和 NOCOPY 子句插入拔出的 PDB alter pluggable database pdb2 close immediate; alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml'; drop pluggable database pdb2 keep datafiles; create pluggable database salespdb as clone using '/home/oracle/pdb2.xml' nocopy tempfile reuse; 示例 3:使用 source_file_name_convert、nocopy 和 storage 子句插入拔出的 PDB alter pluggable database pdb2 close immediate; alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml'; drop pluggable database pdb2 keep datafiles; mkdir /u01/app/oracle/oradata/cdb1/sales/ mv /u01/app/oracle/oradata/cdb1/pdb2/* /u01/app/oracle/oradata/cdb1/sales/ create pluggable database salespdb using '/home/oracle/pdb2.xml' source_file_name_convert = ('/u01/app/oracle/oradata/cdb1/pdb2/', '/u01/app/oracle/oradata/cdb1/sales/') nocopy storage (maxsize 2g) tempfile reuse; 示例 4:使用 COPY, PATH_PREFIX 和 FILE_NAME_CONVERT 子句插入拔出的 PDB alter pluggable database pdb2 close immediate; alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml'; drop pluggable database pdb2 keep datafiles; mkdir /u01/app/oracle/oradata/cdb1/sales/ create pluggable database salespdb using '/home/oracle/pdb2.xml' copy path_prefix = '/u01/app/oracle/oradata/cdb1/sales/' file_name_convert = ('/u01/app/oracle/oradata/cdb1/pdb2', '/u01/app/oracle/oradata/cdb1/sales/'); 示例 5:使用 SOURCE_FILE_NAME_CONVERT, MOVE, FILE_NAME_CONVERT 和 STORAGE 子句插入 拔出的 PDB alter pluggable database pdb2 close immediate; alter pluggable database pdb2 unplug into '/home/oracle/pdb2.xml'; drop pluggable database pdb2 keep datafiles; mkdir /u01/app/oracle/oradata/cdb1/sales/ mv /u01/app/oracle/oradata/ORCL/pdb2/* /u01/app/oracle/oradata/cdb1/sales/ mkdir /u01/app/oracle/oradata/cdb1/salespdb/ cre
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值