【问题标题】:Why is the last element in associative array (index by table) not printed by?为什么不打印关联数组中的最后一个元素(按表索引)?
【发布时间】:2020-07-24 21:04:00
【问题描述】:

这似乎是一个基本的事情,但我无法弄清楚。 我有一个如下所示的 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】:

    把这个sn-p加到你的block里面看看原因,就是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;
    

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

    【讨论】:

      【解决方案2】:

      ARRAY.FIRST 是数组中最小的索引号,因此在您的情况下它将是 -1。另一方面,ARRAY.LAST 获得了最大的索引号(100)。

      然后FOR循环从最小索引到最大,步长为1。但是当它到达一个不存在的索引时,它会抛出一个异常。

      所以只需在循环中添加一个IF 语句来检查特定索引处的元素是否存在。

      IF array.EXISTS(i) THEN
        -- do something
       null;
      END IF;
      

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多