PL/SQL变长数组是PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限制的。也即是说变长数组的下标固定下限等于1,上限可以扩展。下面给出具体的描述及其使用方法。

一、变长数组语法

//type_name 用于指定varray类型名,size_limit 定义varray元素的最大个数,element_type用于指定元素的数据类型 
TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL];
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     //声明一个包含10个元素的变长数组,且且数据类型为dept.dname类型
  7     TYPE name_type IS VARRAY( 10 ) OF dept.dname%TYPE;   
  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 
  8DBMS_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 
  8DBMS_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 
  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

PL/SQL — 变长数组的更多相关文章

  1. PL/SQL 嵌套表变长数组和索引表[转]

    关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...

  2. oracle:变长数组varray,嵌套表,集合

    创建变长数组类型 ) );  这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...

  3. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  4. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  5. C99新特性:变长数组(VLA)

    C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...

  6. c语言,变长数组

    下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...

  7. C99中的变长数组(VLA)

    处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...

  8. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  9. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

随机推荐

  1. Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)

    这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:Half-size VGA:即:VGA的一半,分辨率为480× ...

  2. Adding iAds to Cocos2d-x on iOS

    http://www.mwebb.me.uk/2013/08/adding-iads-to-cocos2d-x-on-ios.html Looking at the forums it seems a ...

  3. 最新 Sublime Text 3 Package Control 安装方法

    相信看到这个帖子的童鞋,一般至少对 Sublime Text 有所了解了,废话不多讲,个人在 ST2 还没用好的时候, Sublime Text 3 又横空出世了,不过现在 ST3 还是 beta 版 ...

  4. iOS web与js的简单交互

    我们在封装网页的时候经常会遇到需要往网页里面的控件添加数据,但是怎么添加又成了难点.本人最近在开发的时候就遇到这样的事,解决之后,来和大家分享一下. //以必应网站为例 [web loadReques ...

  5. datagrid rownumber行号与数据行显示错位的解决办法

    最近在使用datagrid控件,遇到问题多多. 其中一个就是datagrid在使用行编号的情况下,行编号与数据行出现错位的情况,如图:

  6. 理解JavaScript原型式继承

    0.基础 javascript没有类的概念, javascript不需要实例化某个具体类的实例.javascript对象本身可以用来创建对象, 而对象可以继承自其他对象, 这个概念称为原型式继承 每个 ...

  7. php 统计在线人数,今日访问量,总访问量

    直接复制到本站点下测试即可 代码如下: <?php header('Content-type: text/html; charset=utf-8');$online_log = "co ...

  8. (ASP.net)利用Application对象制作简单聊天室

    1.共四个页面,Default.aspx默认主页,Default2.aspx聊天室 default3.aspx显示用户列表,default4.aspx显示聊天内容,添加一个Global.asax全局程 ...

  9. activity调用finish方法理解

    /** * Call this when your activity is done and should be closed. The * ActivityResult is propagated ...

  10. ArrayList、Vector、LinkedList的区别及其优缺点? (转载)

    原文链接:http://blog.csdn.net/wangzff/article/details/7296648 ArrayList,LinkedList,Vestor这三个类都实现了java.ut ...