为什么关联数组中的最后一个元素(按表索引)不打印?

问题描述 投票:1回答:1

这似乎是基本的事情,但我无法弄清楚。我有一个如下的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
sql arrays oracle plsql associative-array
1个回答
0
投票

将此代码段添加到您的代码块中以查看原因,这是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;

但这不是一个好主意,因为遍历您已经知道不是关联数组的索引的所有整数值效率很低。

© www.soinside.com 2019 - 2024. All rights reserved.