----------------嵌套表---------------------------
定义——由其没有最大数目限定的的单维集合,也就是无上限,存放个数无限制,排列是紧密的。
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元素出来
------------------------------------------