1、varray固定数组
简单来说,varray就是一维数组,保存一种数据类型的数据,长度固定。声明的时候若为空数组,则表示还没有分配空间,需要手工分配空间extend,否则会报错。另外需要注意的是,该数组的下标是从1开始的。
set serveroutput on;
declare
no int :=1;
type fixed_array is varray(4) of char(2);---varray固定数组类型定义;
Farray fixed_array :=fixed_array();---varray固定数组声明,这里定义的数组为空数组,并没有分配任何空间
begin
for i in (select distinct COUNTRY_ISO_CODE from countries where rownum<4)loop
farray.extend;---分配空间,不能访问空数组,所以空数组的场合,必须进行数组扩展
farray(no):=i.COUNTRY_ISO_CODE;---下标从1开始,不能超过数组所有元素的总和,当下标超出允许范围时,出现异常:ORA-06532: Subscript outside of limit
no := no+1;
end loop;
dbms_output.put_line('分配的空间:'|| farray.count);---count这个API方法是输出所分配的空间;
for i in 1..farray.count loop ----输出结果值;
dbms_output.put('/'||farray(i));
if i=farray.count then
dbms_output.new_line;
end if;
end loop;
anonymous block completed
分配的空间:3
/US/DE/GB
2、可变数组
顾名思义,就是数组的长度没有限制。其中有两种集合类型,一是嵌套表,二是联合数组。跟上面的varray一样,数组的下标从1开始。不过,联合数组的序号有可能是不连续的,删除了其中的某个元素之后就不连续了。
/**嵌套表作为标量集合的时候,跟上面的varray差不多。
**声明是若为空数组,则需要分配空间;
**不同的是,分配的空间没有限制
set serveroutput on;
declare
no int :=1;
type variable_array is table of char(2);--没有空间分配的限定设置
vtable variable_array :=variable_array();
begin
for i in (select distinct COUNTRY_ISO_CODE from countries where rownum<5)loop
vtable.extend; --分配空间
vtable(no):=i.COUNTRY_ISO_CODE;
no := no+1;
end loop;
dbms_output.put_line('分配的空间:'|| vtable.count);---可以看到结果为4
for i in 1..vtable.count loop
dbms_output.put('/'||vtable(i));
if i=vtable.count then
dbms_output.new_line;
end if;
end loop;
anonymous block completed
分配的空间:4
/US/DE/GB/NL
/**联合数组存在这比较多的不同:
**1、声明方式不一样;
**2、不用显式分配空间
**3、删除之后,空间被回收,但是序号依然存在,为此输出值的时候需要注意这些不存在值的序号,否则会报错
set serveroutput on;
declare
no int :=1;
type variable_array is table of char(2) index by binary_integer;--没有空间分配的限定设置
vtable variable_array ;---声明的方式有所不同;
begin
for i in (select distinct COUNTRY_ISO_CODE from countries where rownum<6)loop
----vtable.extend; --分配空间
vtable(no):=i.COUNTRY_ISO_CODE;
no := no+1;
end loop;
dbms_output.put_line('分配的空间:'|| vtable.count);---可以看到结果为5
vtable.delete(2);
dbms_output.put_line('删除后分配的空间:'|| vtable.count);---可以看到结果为4,即已经回收了删除的空间
if vtable.exists(2)=false then
dbms_output.put_line('删除之后的元素不再存在');----可以看到该元素已经不存在
end if;
for i in 3..vtable.count loop ---如果这里包含不存在的元素2的话,会报错。
dbms_output.put('/'||vtable(i));
if i=vtable.count then
dbms_output.new_line;
end if;
end loop;
record,保存的是一行数据。与%TYPE,%ROWTYPE用起来比较方便。可以随着表列类型的更新而更新。
/**record只是保存返回的一行记录;
**不过,record比较方便的就是其类型可以随着表列类型的更新而更新;
set serveroutput on;
declare
OneRow countries%rowtype;---该record类型对应的是表的所有列;
type Rrecord is record( ---定义record类型,只是某些表的某些列;
code countries.COUNTRY_ISO_CODE%type,
name countries.COUNTRY_NAME%type
country Rrecord;---声明对象;
begin
select * into OneRow from countries where rownum<2;----注意,只能往其中输入一行数据,否则会报错:ORA-01422: 实际返回的行数超出请求的行数;
select country_iso_code,country_name into country from countries where rownum<2;--部分列
dbms_output.put_line('国家ID:'||country.code);
dbms_output.put_line('国家名称:'||country.name);
anonymous block completed
国家ID:US
国家名称:United States of America
4、保存列表数据
上面提到的都是保存一维数组,如果需要保存多维数组的话,可以利用嵌套来实现。
record+varray/嵌套表/联合数组。三种集合类型用法比较相似,为此只是对varray举例
declare
no int :=1;
type Rrecord is record(
code countries.COUNTRY_ISO_CODE%type,
name countries.COUNTRY_NAME%type);----定义record记录类型
type var is varray(3) of Rrecord;-----定义记录集合数组
multirow var := var();----------------声明记录集合数组
begin
multirow.extend(3);---分配空间;
select country_iso_code,country_name BULK COLLECT INTO multirow from countries where rownum<4;---批量插入数据;
----输出结果
for i in 1..multirow.count loop
dbms_output.put_line(i||' code:'||multirow(i).code||' name: '||multirow(i).name);
end loop;
anonymous block completed
1 code:US name: United States of America
2 code:DE name: Germany
3 code:GB name: United Kingdom
在oracle 11.2中,oracle总共提供了三种集合类型:varray,嵌套表,联合数组。所谓集合,简单来说就是保存多行数据的数据类型,相当于保存在内存中的小型表,便于暂时保存数据,以及数据的重复使用。下面的表简单描述了其中的区别与联系:类型保存数据类型数量长度创建实例
ORACLE 集合(关联
数组,
嵌套表,
VARRAY)
2014年10月25日 19:27:22 vampireslove 阅读数:835 标签: plsql 更多
个人分类:
ORACLE
三种集合比较
表数据列
(binary_integer、pls_integer、
varchar2)
联合数组以前被称为PL/SQL表。在表中不能使用联合数组,只能将它们用作程序设计的结构体。只能在PL/SQL中访问联合数组。
注意到联合数组带来的一些关键问题是非常重要的。这些问题使我们介绍它们的用法时,需要采取一些特别的方法。这些问题包括:
联合数组不需要初始化,也没有构造函数语法。在对它们进行赋值以前,也不需要专门为其分配存储空间,也就不需要使用集合API的EXTEND方法。
集合可以有三种实现方式:
1 自定义一个TYPE使用VARRAY来得到一个数组但只能对基本类型定义如:
CREATE TYPE 类型名 AS VARRAY OF VARCHAR2(20);
1 自定义一个TYPE使用VARRAY来得到一个数组但只能对基本类型定义如:
CREATE TYPE 类型名 AS VARRAY(52) OF VARCHAR2(20);...
BEGIN
-- 初始化
数组元素,大小为3
courses := CourseList('Biol 4412 ', 'Psyc 3112 ', 'Anth 3001 ');
-- ...