设为首页 收藏本站
查看: 946|回复: 0

[经验分享] ORACLE 中 VARRAY的用法

[复制链接]

尚未签到

发表于 2016-7-20 07:28:10 | 显示全部楼层 |阅读模式
  转自:http://blog.csdn.net/johnnydev/article/details/7530362
  

看到同事写的存储过程里面有这样一句:
    TYPE ARRAY_TYPE IS VARRAY(10000) OF VARCHAR2(60);
    感到很茫然,幸好还有网络可以求助,我理解成是:长度为10000的数组,其每个为长度为最大长度为60的varchar2类型。不知是否准确?
1. 声明和初始化VARRAY变量
你不可以直接声明一个VARRAY变量。必须先声明一个包含这个数组最大容量的类型:


  • TYPE MY_ARRAY_TYPE IS VARRAY(10) OF NUMBER; 

然后,你就可以用这个类型声明VARRAY变量:


  • V MY_ARRAY_TYPE; 

在你对这个数组进行操作以前,必须先初始化该数组。你既可以在声明它的时候对其初始化,也可以在声明后对其赋值。下面展示了在声明的同时对其进行初始化:


  • V MY_ARRAY_TYPE := MY_ARRAY_TYPE (); 

2. 从指定的条目处取值
把条目的数目作为下标。下标可以是返回整数值(该值小于或等于数组条目数)的任意表达式,如:


  • K := V(3);  
  • I := 2;  
  • L := V(I+1); 

3. 得到数组的容量
对VARRAY变量使用COUNT()方法。注意,你不需要指定圆括号,因为这个方法没有输入参数:


  • N_ENTRIES := V.COUNT(); 

这告诉你这个数组中正在使用的条目数。当VARRAY类型被声明的时候,其最大的容量也就被定义了。你可以用LIMIT()方法得到该容量:


  • ARRAY_CAPACITY := V.LIMIT(); 

4. 遍历VARRAY中的值
你可以使用多种技术。最简单的是使用FOR循环:


  • FOR I IN 1..V.COUNT() LOOP  
  • DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));  
  • END LOOP; 

你也可以使用FIRST()和LAST()方法。FIRST()返回数组的第一个条目的下标(总是1),LAST()返回数组的最后一个条目的下标(与COUNT方法相同)。


  • FOR I IN V.FIRST()..V.LAST() LOOP  
  • DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));  
  • END LOOP; 

你也可以使用PRIOR(n)和NEXT(n)方法,这两个方法分别返回给定条目的前一个和后一个条目的下标。例如,下面的代码用来向后遍历整个数组:


  • I := V.COUNT();  
  • WHILE I IS NOT NULL LOOP  
  • DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I));  
  • I := V.PRIOR(I);  
  • END LOOP; 

PRIOR(n)和n-1是一样的,NEXT(n)和n+1是一样的,但是PRIOR(1)和NEXT (V.COUNT())则返回NULL。
5. 对VARRAY的扩展
使用EXTEND(k)方法。这个方法可以在VARRAY的最后追加k个新的条目。如果k没有被指定,只增加一个条目。新增的条目没有值(默认为NULL),但是你可以对它们进行初始化。COUNT()和LAST()方法现在可以反映VARRAY新的容量。以下代码向数组中添加两个条目并对其进行初始化:


  • I := V.LAST();  
  • V.EXTEND(2);  
  • V(I+1) := 5;  
  • V(I+2) := 6; 

注意,你对VARRAY的扩展不可以超过其最大容量(通过LIMIT()方法得到),且在对VARRAY扩展前必须要对其进行初始化。以下代码是无效的:


  • VT MY_ARRAY_TYPE;  
  • VT.EXTEND(5); 

下面的代码是有效的:


  • VT MY_ARRAY_TYPE;  
  • VT := MY_ARRAY_TYPE();  
  • VT.EXTEND(5); 

6. 对VARRAY的缩减
使用TRIM(k)方法。这个方法在VARRAY的尾部删除最后k个条目。当k没有被指定时,删除最后一个条目。已被删除的条目的值将丢失。COUNT()和LAST()方法反映了新的容量。下面从VARRAY中删除最后一个条目:


  • V.TRIM; 

你也可以用以下方式删除数组中的所有条目:


  • V.TRIM(V.COUNT()); 

或者用具有效果相同的DELETE()方法。该方法删除数组中的所有条目,并把其容量设置为0(也就是说,V.COUNT()现在的返回值为0)。


  • V.DELETE() 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246535-1-1.html 上篇帖子: Oracle--赋权限 下篇帖子: Oracle 表死锁解除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表