嵌套表与索引表

两者都可以用来存储数组.嵌套表更像通常的数组,因为它的下标固定从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是最大下标值,与索引表的元素赋值顺序无关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值