相关文章推荐
飞奔的篮球  ·  pixivapp怎么进fanbox - 百度·  3 月前    · 

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 '); -- ...