在上一文<<24.PLSQL中的索引表>>中,我们介绍了oracle中的索引表的使用,之前提到过索引表类似C语言中的数组,本文介绍一种PLSQL中真正的数组---Varray。Varray具有以下特点:
1、Varray是固定长度的数组,在创建时需要制定数组的长度和类型。
2、Varray可以放置重复的元素。
3、Varray是一种可以在PLSQL外进行编译的类型,它的声明周期和作用域都是全局的,可被当做用户自定义的一种数据类型使用。如下,我们创建了一个名叫projects_varray的数组后,用sql developer可以看到这个数据类型,我们可以像使用普通的类型如,number、varchar2一样使用它:
一、创建数组
创建数组的语法如下:
create or replace type 数组名称 is varray of 数组元素类型
如下面的例子,我们创建了一个名叫projects_varray的数组,数组中元素的类型为varchar2(20)。
create or replace type projects_varray is varray(10) of varchar2(20);
二、创建使用数组作为字段的数据表
一旦创建好数组之后,我们可以像使用普通的数据类型一样的使用数组,如下,我创建了一个叫做mydept的数据表,它的第三个字段就是用的projects_varray数组,表示每个部门完成的项目列表。
create table mydept(deptnum number,dname varchar2(20),projects projects_varray);
三、向含有数组的数据表中插入数据
通过以下的方式向含有数组的数据表插入数据:
insert into mydept values (1,'系统软件部',projects_varray('NGP','Pecstart'));
使用select语句查看我们刚才查入的数据,发现结果如下:
数组一旦创建成功,其使用方法其实已经和普通的数据类型没有两样了,比如我们还可以和普通类型一样修改数据表的字段:
update mydept set projects=projects_varray('GNP','Pecstar','IEMS') where deptnum=1;
再次查询修改后的数据,得到的结果如下:
四、在PLSQL中使用数组
以上的代码都是在plsql语句块之外执行的,我们也可以把数组的定义放到PLSQL里面,如下面的代码,在declare块定义了一个数组projects_varray2:
declare
type projects_varray2 is varray(10) of varchar2(20);
begin
null;
end;
/
我们先留意下在declare里面创建的数组和在外面创建数组的语法有什么不同?答案就是在declare里面没有create or replace 关键字,这也就限定了创建的数据类型的作用域和声明周期只能在这个语句块之内,这也就是之前我们介绍过的记录类型record、索引表类型table的只能在创建它的plsql语句内使用的原因。
创建好数组之后,我们也可以像使用索引表一样对数组进行遍历:
declare
type projects_varray2 is varray(4) of varchar2(20);
v_projects projects_varray2:=projects_varray2('NGP','Pecstar','IEMS',NULL);
begin
v_projects(4):='IEEM';
for x in v_projects.first .. v_projects.last loop
dbms_output.put_line(v_projects(x));
end loop;
end;
/
结果如下: