这似乎是基本的事情,但我无法弄清楚。我有一个如下的PLSQL代码块。它创建一个简单的稀疏关联数组,并在下标处将5个元素存储为-1,0,1,2,100。
打印ARRAY.LAST得到100,ARRAY.COUNT得到5。在我的while循环中,它正确打印了所有元素。但是,从ARRAY.FIRST到ARRAY.LAST的For循环仅打印连续下标到2的元素,即使ARRAY.LAST给出100
DECLARE
TYPE assoc_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
table1 assoc_array;
i BINARY_INTEGER;
BEGIN
table1(-1) := 100;
table1(0) := 101;
table1(1) := 102;
table1(2) := 103;
table1(100) := 104;
i := table1.FIRST;
dbms_output.put_line(table1.FIRST);
dbms_output.put_line(table1.LAST);
dbms_output.put_line(table1.COUNT);
i := table1.first;
while (i is not null)
loop
dbms_output.put_line( table1(i) );
i := table1.next(i);
end loop;
dbms_output.put_line( '***');
for i IN table1.FIRST .. table1.LAST
loop
dbms_output.put_line(table1(i) );
end loop;
END;
输出看起来像:
-1
100
5
100
101
102
103
104
***
100
101
102
103
将此代码段添加到您的代码块中以查看原因,这是ORA-01403:
...
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(sqlerrm);
END;
您的循环不会遍历有效的数组索引。它从-1 .. 100
开始循环,当您尝试访问table1(3)
时,您就不能。
或者,您可以运行此:
FOR i IN table1.FIRST .. table1.LAST LOOP
IF table1.EXISTS(i) THEN
dbms_output.put_line(table1(i));
END IF;
END LOOP;
但这不是一个好主意,因为遍历您已经知道不是关联数组的索引的所有整数值效率很低。