PL/SQL变长数组

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

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


 

目录
相关文章
|
2月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
44 2
|
5月前
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
114 0
|
5月前
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`-&gt;&gt;`提取特定字段或`@&gt;`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
82 0
|
7月前
|
SQL 数据库 Perl
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
569 0
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
8月前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。
|
8月前
|
SQL Oracle 安全
Oracle的PL/SQL异常处理方法:守护数据之旅的“魔法盾”
【4月更文挑战第19天】Oracle PL/SQL的异常处理机制是保障数据安全的关键。通过预定义异常(如`NO_DATA_FOUND`)和自定义异常,开发者能优雅地管理错误。异常在子程序中抛出后会向上传播,直到被捕获,提供了一种集中处理错误的方式。理解和善用异常处理,如同手持“魔法盾”,确保程序在面对如除数为零、违反约束等挑战时,能有效保护数据的完整性和程序的稳定性。
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
163 13