PL/SQL变长数组

PL/SQL变长数组

转自:http://blog.csdn.net/leshami/article/details/7387647

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  
        CURSOR name_cur IS  
              SELECT dname  
              FROM    dept  
              WHERE  deptno < 40;  
     
        TYPE name_type IS VARRAY( 10 ) OF dept.dname%TYPE;  -->声明一个包含10个元素的变长数组,且数据类型为dept.dname类型   
     
        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  
        TYPE name_type IS VARRAY( 2 ) OF VARCHAR2( 10 );  
     
        varray_name_tab    name_type := name_type( 'Robinson', 'Jackson' ); -->此处对varray_name_tab初始化并赋初值   
  BEGIN  
        FOR i IN 1 .. varray_name_tab.COUNT                              -->使用count来遍历并输出变长数组的所有元素   
        LOOP  
              DBMS_OUTPUT.put_line(    'Name varray_name_tab( '  
                                                        || 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  
        TYPE name_type IS VARRAY( 2 ) OF VARCHAR2( 10 );  
     
        varray_name_tab    name_type := name_type( 'Robinson', 'Jackson' );  
  BEGIN  
        FOR i IN 1 .. varray_name_tab.COUNT  
        LOOP  
              DBMS_OUTPUT.put_line(    'Name varray_name_tab( '  
                                                        || 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 ); -->创建变长数组类型   
  /  
 
Type created.  
 
scott@CNMMBO> CREATE TABLE tb_emp              -->创建表tb_emp且其中一列使用到了变长数组   
  (  
        empno    NUMBER( 4 )  
    , ename    VARCHAR2( 10 )  
    , phone    varray_phone                      -->列phone使用到了变长数组   
  )  
  ;  
 
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')                 
  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')  
  from dual;  
 
1 row created.  
 
-->插入变长数组元素超出预定义字符串长度时收到错误提示   
scott@CNMMBO> insert into tb_emp select 8888,'Johnson',varray_phone('134234567890000000000000 00000000000000000000000')     
  from dual;  
insert into tb_emp select 8888,'Johnson',varray_phone('134234567890000000000000 00000000000000000000000')  
                                                                                                          *  
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('134234567890000000000000 00000000000000000000000')   
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值