PL/SQL变长数组

  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

四、更多参考

启用用户进程跟踪

父游标、子游标及共享游标

绑定变量及其优缺点

dbms_xplan之display_cursor函数的使用

dbms_xplan之display函数的使用

执行计划中各字段各模块描述

使用 EXPLAIN PLAN 获取SQL语句执行计划

启用 AUTOTRACE 功能

函数使得索引列失效

Oracle 绑定变量窥探

PL/SQL 联合数组与嵌套表


 

转载于:https://www.cnblogs.com/ajuanabc/archive/2012/03/23/2462721.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值