两者都可以用来存储数组.嵌套表更像通常的数组,因为它的下标固定从1开始,且连续.而索引表的下标可以是 -2147483647..-2147483647之间的任意分散值.
一.代码
创建和遍历嵌套表、索引表
create type t_object as object(name varchar2(12),count number(3);
declare
type t_table1 is table of t_object;--嵌套表
type t_table2 is table of t_object index by binary_integer;--索引表
a1 t_table1 := t_table1();--初始化
a2 t_table2;--无需初始化
procedure printNestedTable(para1 t_table1) as
v_index number;
begin
dbms_output.put_line('[printNestedTable]');
v_index := para1.first;--如果是空数组v_index会被赋null
while v_index <= para1.last loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
end loop;
dbms_output.put_line(' ');
end printNestedTable;
--嵌套表的下标是从1的固定连续值
--所以可以用for循环来遍历
procedure printNestedTable2(para1 t_table1) as
v_index number;
begin
dbms_output.put_line('[printNestedTable2]');
for v_index in 1..para1.count loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
end loop;
dbms_output.put_line(' ');
end printNestedTable2;
--索引表的下标可以是负数,且无需连续,但元素的存储是紧凑的.
procedure printIndexedTable(para1 t_table2) as
v_index number;
begin
dbms_output.put_line('[printIndexedTable]');
v_index := para1.first;--如果是空数组v_index会被赋null
while v_index <= para1.last loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
end loop;
dbms_output.put_line(' ');
end printIndexedTable;
begin
dbms_output.put_line('a1.extend(3)之前:');
dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
printNestedTable(a1);
printNestedTable2(a1);
dbms_output.put_line('==============');
a1.extend(3);
dbms_output.put_line('a1.extend(3)之后:');
dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
dbms_output.put_line('==============');
a1(1):=t_object('aaa',11);
a1(3):=t_object('ccc',33);
--a1(5):=t_object('eee',55);会报下标出界错误
dbms_output.put_line('a1(1),a1(3)赋值之后:');
printNestedTable(a1);
printNestedTable2(a1);
dbms_output.put_line('==============');
dbms_output.put_line('a2赋值之前:');
dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
dbms_output.put_line('==============');
a2(11000):= t_object('aaa',11);--无需通过extend来分配空间
a2(-3):= t_object('bbb',22);
dbms_output.put_line('a2赋值后:');
dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
printIndexedTable(a2);
end;
二.执行结果
a1.extend(3)之前:
fisrt= last=
[printNestedTable]
[printNestedTable2]
==============
a1.extend(3)之后:
fisrt=1 last=3
==============
a1(1),a1(3)赋值之后:
[printNestedTable]
1:aaa,11
2:,
3:ccc,33
[printNestedTable2]
1:aaa,11
2:,
3:ccc,33
==============
a2赋值之前:
fisrt= last=
==============
a2赋值后:
fisrt=-3 last=11000
[printIndexedTable]
-3:bbb,22
11000:aaa,11
PL/SQL 过程已成功完成。
三.结论
1.索引表无需初始化,也不用extend来扩展空间
2.索引表的键值可以是负值,且不必连续
3.嵌套表的键值是连续和固定的,从 1开始.例如extend(3)产生的键值是1,2,3;数组下标也只能是1,2,3
4.first是最小值下标值,last是最大下标值,与索引表的元素赋值顺序无关
一.代码
创建和遍历嵌套表、索引表
create type t_object as object(name varchar2(12),count number(3);
declare
type t_table1 is table of t_object;--嵌套表
type t_table2 is table of t_object index by binary_integer;--索引表
a1 t_table1 := t_table1();--初始化
a2 t_table2;--无需初始化
procedure printNestedTable(para1 t_table1) as
v_index number;
begin
dbms_output.put_line('[printNestedTable]');
v_index := para1.first;--如果是空数组v_index会被赋null
while v_index <= para1.last loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
end loop;
dbms_output.put_line(' ');
end printNestedTable;
--嵌套表的下标是从1的固定连续值
--所以可以用for循环来遍历
procedure printNestedTable2(para1 t_table1) as
v_index number;
begin
dbms_output.put_line('[printNestedTable2]');
for v_index in 1..para1.count loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
end loop;
dbms_output.put_line(' ');
end printNestedTable2;
--索引表的下标可以是负数,且无需连续,但元素的存储是紧凑的.
procedure printIndexedTable(para1 t_table2) as
v_index number;
begin
dbms_output.put_line('[printIndexedTable]');
v_index := para1.first;--如果是空数组v_index会被赋null
while v_index <= para1.last loop
dbms_output.put_line(v_index||':'||para1(v_index).name||','||para1(v_index).count);
v_index:=para1.next(v_index);--如果到了结尾v_index会被赋null
end loop;
dbms_output.put_line(' ');
end printIndexedTable;
begin
dbms_output.put_line('a1.extend(3)之前:');
dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
printNestedTable(a1);
printNestedTable2(a1);
dbms_output.put_line('==============');
a1.extend(3);
dbms_output.put_line('a1.extend(3)之后:');
dbms_output.put_line('fisrt='||a1.first||' last='||a1.last);
dbms_output.put_line('==============');
a1(1):=t_object('aaa',11);
a1(3):=t_object('ccc',33);
--a1(5):=t_object('eee',55);会报下标出界错误
dbms_output.put_line('a1(1),a1(3)赋值之后:');
printNestedTable(a1);
printNestedTable2(a1);
dbms_output.put_line('==============');
dbms_output.put_line('a2赋值之前:');
dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
dbms_output.put_line('==============');
a2(11000):= t_object('aaa',11);--无需通过extend来分配空间
a2(-3):= t_object('bbb',22);
dbms_output.put_line('a2赋值后:');
dbms_output.put_line('fisrt='||a2.first||' last='||a2.last);
printIndexedTable(a2);
end;
二.执行结果
a1.extend(3)之前:
fisrt= last=
[printNestedTable]
[printNestedTable2]
==============
a1.extend(3)之后:
fisrt=1 last=3
==============
a1(1),a1(3)赋值之后:
[printNestedTable]
1:aaa,11
2:,
3:ccc,33
[printNestedTable2]
1:aaa,11
2:,
3:ccc,33
==============
a2赋值之前:
fisrt= last=
==============
a2赋值后:
fisrt=-3 last=11000
[printIndexedTable]
-3:bbb,22
11000:aaa,11
PL/SQL 过程已成功完成。
三.结论
1.索引表无需初始化,也不用extend来扩展空间
2.索引表的键值可以是负值,且不必连续
3.嵌套表的键值是连续和固定的,从 1开始.例如extend(3)产生的键值是1,2,3;数组下标也只能是1,2,3
4.first是最小值下标值,last是最大下标值,与索引表的元素赋值顺序无关