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

[经验分享] PL/SQL变长数组

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-9 09:41:53 | 显示全部楼层 |阅读模式
PL/SQL变长数组时PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限
制的。也即是说变长数组的下标固定下限等于1,上限可以扩展。下面给出具体的描述及其使用方法。



一、变长数组语法
        TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF  -->type_name 用于指定varray类型名,size_limit 定义varray元素的最大个数
        element_type [NOT NULL];                                    -->element_type用于指定元素的数据类型
        varray_name TYPE_NAME;                                      -->varray_name 用于定义varray变量



二、变长数组特性
          变长数组主要的特性即是元素的最大个数是有限制
          变长数组下标固定为1,上限可以扩展
          与嵌套表类似,在变长数组声明时自动设置为NULL值.所谓的空值指的是集合本身是空,不是针对它所拥有的元素
          故在元素引用前需要对其进行初始化



三、变长数组示例


    --1、声明变长数组,并输出其结果  
    scott@CNMMBO> DECLARE  
      2     CURSOR name_cur IS  
      3        SELECT dname  
      4        FROM   dept  
      5        WHERE  deptno < 40;  
      6   
      7     TYPE name_type IS VARRAY( 10 ) OF dept.dname%TYPE;  -->声明一个包含10个元素的变长数组,且且数据类型为dept.dname类型  
      8   
      9     varray_dname_tab   name_type := name_type( );       -->初始化变长数组  
     10     v_counter          INTEGER := 0;                     
     11  BEGIN  
     12     FOR name_rec IN name_cur  
     13     LOOP  
     14        v_counter   :=  
     15           v_counter  
     16           + 1;  
     17        varray_dname_tab.EXTEND;                          -->使用extend进行扩展   
     18        varray_dname_tab( v_counter ) := name_rec.dname;  -->按下标输出变长数组的所有元素  
     19        DBMS_OUTPUT.put_line(   'Dname ('  
     20                             || v_counter  
     21                             || ') is :'  
     22                             || varray_dname_tab( v_counter ) );  
     23     END LOOP;  
     24  END;  
     25  /  
    Dname (1) is :ACCOUNTING  
    Dname (2) is :RESEARCH  
    Dname (3) is :SALES      
      
    --2、对变长数组直接赋初值,且使用count遍历并输出所有元素         
    scott@CNMMBO> DECLARE  
      2     TYPE name_type IS VARRAY( 2 ) OF VARCHAR2( 10 );  
      3   
      4     varray_name_tab   name_type := name_type( 'Robinson', 'Jackson' ); -->此处对varray_name_tab初始化并赋初值  
      5  BEGIN  
      6     FOR i IN 1 .. varray_name_tab.COUNT                -->使用count来遍历并输出变长数组的所有元素  
      7     LOOP  
      8        DBMS_OUTPUT.put_line(   'Name varray_name_tab( '  
      9                             || i  
     10                             || ' ) is : '  
     11                             || varray_name_tab( i ) );  
     12     END LOOP;  
     13  END;  
     14  /  
    Name varray_name_tab( 1 ) is : Robinson  
    Name varray_name_tab( 2 ) is : Jackson  
      
    PL/SQL procedure successfully completed.  
      
    --3、超出变长数组大小的情形  
    scott@CNMMBO> DECLARE  
      2     TYPE name_type IS VARRAY( 2 ) OF VARCHAR2( 10 );  
      3   
      4     varray_name_tab   name_type := name_type( 'Robinson', 'Jackson' );  
      5  BEGIN  
      6     FOR i IN 1 .. varray_name_tab.COUNT  
      7     LOOP  
      8        DBMS_OUTPUT.put_line(   'Name varray_name_tab( '  
      9                             || i  
     10                             || ' ) is : '  
     11                             || varray_name_tab( i ) );  
     12     END LOOP;  
     13   
     14     varray_name_tab.EXTEND;  
     15     varray_name_tab( 3 ) := 'Johnson';  
     16     DBMS_OUTPUT.put_line( 'Name varray_name_tab (3) is '  
     17                          || varray_name_tab( 3 ) );  
     18  END;  
     19  /  
    Name varray_name_tab( 1 ) is : Robinson  
    Name varray_name_tab( 2 ) is : Jackson  
    DECLARE  
    *  
    ERROR at line 1:  
    ORA-06532: Subscript outside of limit  
    ORA-06512: at line 14  
      
    --4、存储变长数组到数据库及修改变长数组  
    scott@CNMMBO> CREATE OR REPLACE TYPE varray_phone IS VARRAY( 2 ) OF VARCHAR2( 40 ); -->创建变长数组类型  
      2  /  
      
    Type created.  
      
    scott@CNMMBO> CREATE TABLE tb_emp        -->创建表tb_emp且其中一列使用到了变长数组  
      2  (  
      3     empno   NUMBER( 4 )  
      4   , ename   VARCHAR2( 10 )  
      5   , phone   varray_phone            -->列phone使用到了变长数组  
      6  )  
      7  ;  
      
    Table created.  
      
    --插入新记录到变长数组  
    scott@CNMMBO> insert into tb_emp select 6666,'Robinson',varray_phone('13423456789','075520123650') from dual;  
      
    1 row created.  
      
    scott@CNMMBO> insert into tb_emp select 7777,'Jackson',varray_phone('13423456789','075520123650') from dual;  
      
    1 row created.  
      
    scott@CNMMBO> commit;  
      
    Commit complete.  
      
    scott@CNMMBO> col phone format a25  
    scott@CNMMBO> select * from tb_emp;   -->查看插入的记录  
      
         EMPNO ENAME      PHONE  
    ---------- ---------- -------------------------  
          6666 Robinson   VARRAY_PHONE('13423456789  
                          ', '075520123650')  
      
          7777 Jackson    VARRAY_PHONE('13423456789  
                          ', '075520123650')  
      
    -->插入变长数组包含3个元素的记录,此时提示超出了变长数组范围  
    scott@CNMMBO> insert into tb_emp select 8888,'Johnson',varray_phone('13423456789','075520123650','010123')         
      2  from dual;  
    insert into tb_emp select 8888,'Johnson',varray_phone('13423456789','075520123650','010123')  
                                             *  
    ERROR at line 1:  
    ORA-22909: exceeded maximum VARRAY limit  
      
    -->修改变长数组长度范围限制到3,且使用cascade,即及联修改到表tb_emp  
    scott@CNMMBO> alter type varray_phone modify limit 3 cascade;   
      
    Type altered.  
      
    -->再次插入数据成功  
    scott@CNMMBO> insert into tb_emp select 8888,'Johnson',varray_phone('13423456789','075520123650','010123')  
      2  from dual;  
      
    1 row created.  
      
    -->插入变长数组元素超出预定义字符串长度时收到错误提示  
    scott@CNMMBO> insert into tb_emp select 8888,'Johnson',varray_phone('13423456789000000000000000000000000000000000000')   
      2  from dual;  
    insert into tb_emp select 8888,'Johnson',varray_phone('13423456789000000000000000000000000000000000000')  
                                                          *  
    ERROR at line 1:  
    ORA-22814: attribute or element value is larger than specified in type  
      
    -->修改变长数组元素的数据长度到varchar2(60),且使用cascade,即及联修改到表tb_emp  
    scott@CNMMBO> alter type varray_phone modify element type varchar2(60) cascade;  
      
    Type altered.  
      
    -->再次插入数据成功  
    scott@CNMMBO> insert into tb_emp select 8888,'Johnson',varray_phone('13423456789000000000000000000000000000000000000')   
      2  from dual;  
      
    1 row created.  
      
    -->查看变长数组的定义  
    scott@CNMMBO> select parent_table_name,parent_table_column,type_name from user_varrays;  
      
    PARENT_TABLE_NA PARENT_TABLE_COLUMN            TYPE_NAME  
    --------------- ------------------------------ ------------------------------  
    TB_EMP          PHONE                          VARRAY_PHONE  


运维网声明 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-21856-1-1.html 上篇帖子: PL/SQL 联合数组与嵌套表 下篇帖子: PL/SQL --> PL/SQL记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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