----------------嵌套表---------------------------

定义——由其没有最大数目限定的的单维集合,也就是无上限,存放个数无限制,排列是紧密的。


1、定义、声明、初始化

declare

 type num_varray is table of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 dbms_output.put_line(to_char(v_numarray(1)));

 dbms_output.put_line(to_char(v_numarray(2)));

 dbms_output.put_line(to_char(v_numarray(3)));

 dbms_output.put_line(to_char(v_numarray(4)));

end;


2、null嵌套表和NULL嵌套表元素


和数组是一样的。


3、访问嵌套表元素——和数组是一样的。

--------------------------------------------

集合(数组、嵌套表)的方法


1、exists方法——返回集合中索引对应的位置是否存在,存在返回true,否则就返回false


数组的案例:

declare

 type num_varray is varray(5) of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 if v_numarray.exists(5) then

   dbms_output.put_line('YES');

 else

   dbms_output.put_line('NO');

 end if;

end;

=======================

2、count方法——返回集合元素的数目

declare

 type num_varray is varray(5) of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 dbms_output.put_line(to_char(v_numarray.count));

end;

======================

3、limit方法——-只有数组有这个方法,返回数组的元素的最大上限

declare

 type num_varray is varray(5) of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 dbms_output.put_line(to_char(v_numarray.limit));

end;


输出:5

========================

4、

first——返回集合中第一个不为null的元素的索引号,如果集合为NULL,返回null

last——返回集合中最后一个不为null的元素的索引号,如果集合为NULL,返回null


declare

 type num_varray is varray(5) of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 dbms_output.put_line(to_char(v_numarray.first));

 dbms_output.put_line(to_char(v_numarray.last));

end;


======================

5


next——返回集合中指定元素的下一个已经被初始化的不为null元素的索引号,如果集合为NULL,返回null

prior——返回集合中指定元素的前一个已经被初始化的不为null元素的索引号,如果集合为NULL,返回null


declare

 type num_varray is varray(5) of number;

 v_numarray num_varray:=num_varray(10,20,30,40);

begin

 dbms_output.put_line(to_char(v_numarray.next(1)));

 dbms_output.put_line(to_char(v_numarray.prior(4)));

end;


6、extend方法——在集合的末尾处添加新元素或者在末尾新初始化元素(可以是null)

declare

 type num_varray is varray(200) of number;

 v_numarray num_varray:=num_varray(null,null);

begin

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray(1):=1001;

 v_numarray(2):=1002;

 v_numarray.extend;  --在集合的末尾处添加一个null元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray(3):=1003;

 v_numarray.extend(5);  --在集合的末尾处添加5个null元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray(8):=1008;

 v_numarray.extend(5,8);  --在集合的末尾处添加5个在索引8处一样值的元素

 dbms_output.put_line(to_char(v_numarray.count));

 for i in 1..v_numarray.count loop

   dbms_output.put_line(nvl(to_char(v_numarray(i)),'NULL'));

 end loop;

end;


输出:

2

3

8

13

1001

1002

1003

NULL

NULL

NULL

NULL

1008

1008

1008

1008

1008

1008


和index-by一样,元素位置给过值null的话是可以输出的,但是没有初始化过是不能访问的。


7、trim方法——在集合的末尾处删除元素

declare

 type num_varray is varray(200) of number;

 v_numarray num_varray:=num_varray(null,null);

begin

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray(1):=1001;

 v_numarray(2):=1002;

 v_numarray.trim;    --在集合末尾删除一个元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray.extend;

 v_numarray(2):=1003;

 v_numarray.trim(2);  --在集合末尾删除2个元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray.extend(2);

 v_numarray(1):=10081;

 v_numarray(2):=10082;

 dbms_output.put_line(to_char(v_numarray.count));

end;



8、delete方法——从嵌套表中删除元素(老师认为有bug!)

declare

 type num_varray is table of number;

 v_numarray num_varray:=num_varray(null,null,null,null,null);

begin

 v_numarray(1):=1001;

 v_numarray(2):=1002;

 v_numarray.delete; --删除全部的元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray.extend(2);

 v_numarray(1):=10081;

 v_numarray(2):=10082;

 v_numarray.delete(2); --删除索引位置2的元素

 dbms_output.put_line(to_char(v_numarray.count));

 v_numarray.extend(2);

 dbms_output.put_line(to_char(v_numarray.count));  --3

 v_numarray(2):=810082;

 v_numarray(3):=810083;

 dbms_output.put_line(to_char(v_numarray.count));  --为什么变成4了?

 for i in 1..4 loop

   dbms_output.put_line(nvl(to_char(v_numarray(i)),'NULL')); ---nvl函数 判断如果为空就输出NULL

 end loop;

end;


输出:

0

1

3

4

10081

810082

810083

NULL    --为什么给2和3位置赋值,会括出一个NULL元素出来

------------------------------------------