当前位置:   article > 正文

嵌套表与索引表

索引表和嵌套表
两者都可以用来存储数组.嵌套表更像通常的数组,因为它的下标固定从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是最大下标值,与索引表的元素赋值顺序无关
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/551817
推荐阅读
相关标签
  

闽ICP备14008679号