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 联合数组与嵌套表

 

时间: 2024-09-29 06:09:26

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

oracle中变长数组varray,嵌套表,集合使用方法_oracle

创建变长数组类型 CREATE TYPE varray_type AS VARRAY(2) OF VARCHAR2(50); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE varray_type MODIFY ELEMENT TYPE varchar2(100) CASCADE; CASCADE选项吧更改传播到数据库中的以来对象.也可以用 INVALIDATE 选项使依赖对

vs2015-C语言数组的变长数组问题

问题描述 C语言数组的变长数组问题 VS2015为什么用不了变长数组,用const定义的也不能用,什么编辑器才能用?求大神帮助 解决方案 跟vs2015没关系,用list吧 解决方案二: c语言变长数组C语言变长数组C语言变长数组 解决方案三: 都不能,你用vecotr吧 解决方案四: c 有变长数组吗? 用stl库吧,向量或者list都可以 解决方案五: 用gcc编译,加上c99标志 解决方案六: c支持变长数组的吗?????????

浅谈C++内存分配及变长数组的动态分配_C 语言

第一部分 C++内存分配 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存 储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员

C语言变长数组data[0]【总结】

1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0].这样设计的目的是让数组长度是可变的,根据需要进行分配.方便操作,节省空间. 2.data[0]结构 经常遇到的结构形状如下: struct buffer { int data_len; //长度 char data[0]; //起始地址 };   在这个结构中,data是一个数组名:但该数组

ArrayList 变长数组

ArrayList相当于STL里面的Vector. 快速初始化的方法: ArrayList<Integer>  a=new ArrayList<Integer> (Arrays.asList(1,2,3,4,5)); 注意函数Arrays.asList返回的是:类Arrays的静态内部类,该类定义见下:  private static class ArrayList<E> extends AbstractList<E>         implements

PL/SQL 游标变量

    游标变量与游标相似,有其共性,也有其不同点.就其共性来说两者都是指向多行查询的结果集中的当前行.都要经历声明,打开,检索与关闭的过程.所不同的是游标与游标变量类似于常量与变量.游标是静态的,而游标变量是动态的,因为游标变量并不与某个特定的查询相绑定.所以,游标变量可以打开任何类型兼容的查询.其次可以将游标变量作为参数传递给本地和存储子程序.本文主要描述游标变量的使用.   一.什么是游标变量    显示游标用于命名一个工作区域,其中保存多行查询的信息,而且该游标始终指向工作区域的内容.而

使用PL/SQL Developer剖析PL/SQL代码

    PL/SQL代码性能瓶颈可以通过DBMS_PROFILER包在命令行的方式下进行剖析来直接获得.对于比较复杂的代码而言,使用图形化的界面来进行剖析无疑是首选.PL/SQL Developer依旧依赖于DBMS_PROFILER包,使用图形化界面来剖析PL/SQL代码,如匿名块,包,过程,函数等,其Profiler结果将列出该剖析代码涉及到的所有包,过程函数等并且可以按照不同的列类型进行排序等.本文以图文的形式介绍了PL/SQL Developer 下实现PL/SQL 代码剖析.   1.

PL/SQL --&amp;gt; 动态SQL调用包中函数或过程

      动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包其下的函数或过程,不能等同于DDL以及DML的调用,其方式稍有差异.如下见本文的描述.       有关动态SQL的描述,请参考:           PL/SQL --> 动态SQL           PL/SQL --> 动态SQL的常见错误   1.动态SQL调用包中过程不正确

对比 PL/SQL profiler 剖析结果

      使用PL/SQL PROFILER 剖析PL/SQL代码是快速定位PL/SQL代码段最有效的方法.在上一篇文章使用PL/SQL PROFILER 定位 PL/SQL 瓶颈代码中描述了安装PROFILER,并给出了剖析的示例.本文参照了Tom大师的代码来对比剖析前后的性能并附上其代码.   1.用于实施剖析的存储过程 --环境 sys@USBO> select * from v$version where rownum<2; BANNER ----------------------