PL/SQL — 变长数组
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 — 变长数组的更多相关文章
- PL/SQL 嵌套表变长数组和索引表[转]
关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...
- oracle:变长数组varray,嵌套表,集合
创建变长数组类型 ) ); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- C99新特性:变长数组(VLA)
C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...
- c语言,变长数组
下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...
- C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
随机推荐
- How to install VXDIAG Honda, Toyota and JLR SDD software
EOBD2 has newly launched Allscanner VXDIAG multi diagnostic tool with OEM diagnostic software: Honda ...
- js用斜率判断鼠标进入div的四个方向
网上大部分判断鼠标移入div移入移出都是使用一下方法: 这个方法确实十分奇特,使用起来十分方便. 后来自己看了一些文章,看到有另一种以斜率的方法来判断鼠标的移动方向. 上图是此方法的示意图,以浏览器左 ...
- aggregation 详解4(pipeline aggregations)
概述 管道聚合处理的对象是其它聚合的输出(桶或者桶的某些权值),而不是直接针对文档. 管道聚合的作用是为输出增加一些有用信息. 管道聚合大致分为两类: parent 此类聚合的"输入&quo ...
- 为什么虚拟机上刚装的centos7只有lo回环网络接口?
centos7默认安装时需要手动激活有线网卡.如果安装时没有激活,需要手动编辑vi /etc/sysconfig/network-scripts/下ifcfg-enoxxONBOOT="ye ...
- UVa 1645 Count(**)
题目大意:输入n,统计有多少个n个结点的有根树,使得每个深度中所有结点的子结点数相同.结果模1000000007. 思路:根据题意,每个结点的每个子树都是相同的.所以n结果为n-1的所有约数的结果加起 ...
- Hive UDAF介绍与开发
UDAF简介 UDAF是用户自定义聚合函数.Hive支持其用户自行开发聚合函数完成业务逻辑. 通俗点说,就是你可能需要做一些特殊的甚至是非常扭曲的逻辑聚合,但是Hive自带的聚合函数不够玩,同时也还找 ...
- ping 命令详解
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说"ping一下某机器,看是不是开着".不能打开网页时会说"你先ping网关地址 ...
- 不关闭seLinux解决vsftpd服务本地用户不能登录问题(500 OOPS: cannot change directory:/home/***
这里不讲vsftpd的基本配置,网上教程已经太多了.这里只说seLinux的问题. 日前在CentOS6.5中安装了vsftpd,按照网上搜索的教程,配置好/etc/vsftpd/vsftpd.con ...
- C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据
#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...
- 华为机试_字符串识别_Vector的使用;
第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列.转换关系如下:描述: 拼音 yi er san si wu liu qi ba jiu ...