为什么由VARCHAR2索引的关联数组存储的元素不超过9个

2022-05-18 00:00:00 sql associative-array oracle plsql

VARCHAR2(32000)索引的关联数组在下面的代码中仅存储9个元素。 而如果我使用由pls_INTEGER索引的关联数组,我可以在数据结构中存储9个以上的元素(在我的例子中为15个元素)。

那么在我的示例中,为什么使用VARCHAR2索引的关联数组不能接受9个以上的元素。

编码:

declare
--TYPE tabperson IS TABLE OF varchar2(8) INDEX BY pls_integer;
TYPE tabperson IS TABLE OF varchar2(8) INDEX BY varchar2 (32000);
wtabperson tabperson ;
begin
   FOR i IN 1..15
     LOOP
        wtabperson(i) := 'A' || i;

        dbms_output.PUT_LINE(
                    'i---------> ' || 'size ' || wtabperson.last || ' content ' || 
                      wtabperson(i));
    end loop;
end;

这是我在控制台中得到的信息:

[2021-06-14 11:32:59] i---------> size 1 content A1
[2021-06-14 11:32:59] i---------> size 2 content A2
[2021-06-14 11:32:59] i---------> size 3 content A3
[2021-06-14 11:32:59] i---------> size 4 content A4
[2021-06-14 11:32:59] i---------> size 5 content A5
[2021-06-14 11:32:59] i---------> size 6 content A6
[2021-06-14 11:32:59] i---------> size 7 content A7
[2021-06-14 11:32:59] i---------> size 8 content A8
[2021-06-14 11:32:59] i---------> size 9 content A9
[2021-06-14 11:32:59] i---------> size 9 content A10
[2021-06-14 11:32:59] i---------> size 9 content A11
[2021-06-14 11:32:59] i---------> size 9 content A12
[2021-06-14 11:32:59] i---------> size 9 content A13
[2021-06-14 11:32:59] i---------> size 9 content A14
[2021-06-14 11:32:59] i---------> size 9 content A15

那么为什么wtabson.last块位于9。

如果我在示例中使用此类型:

TYPE tabperson IS TABLE OF varchar2(8) INDEX BY pls_integer

我得到了预期的结果:

[2021-06-14 11:39:43] i---------> size 1 content A1
[2021-06-14 11:39:43] i---------> size 2 content A2
 //
[2021-06-14 11:39:43] i---------> size 8 content A8
[2021-06-14 11:39:43] i---------> size 9 content A9
[2021-06-14 11:39:43] i---------> size 10 content A10
[2021-06-14 11:39:43] i---------> size 11 content A11
[2021-06-14 11:39:43] i---------> size 12 content A12
[2021-06-14 11:39:43] i---------> size 13 content A13
[2021-06-14 11:39:43] i---------> size 14 content A14
[2021-06-14 11:39:43] i---------> size 15 content A15

有人能解释一下当我使用带有VARCHAR2索引的关联数组时wtabson.last的这种意外行为吗?

提前谢谢


解决方案

您看到的是,因为索引是一个字符串;您添加的第15个元素的索引为‘15’,而不是数字15;与字符串比较,‘9’高于‘15’。因此,last显示的字符串值最高,仍为‘9’。如@Koen sais所示,这是the documented behaviour:

对于由PLS_INTEGER索引的关联数组,第一个和最后一个元素分别是具有最小和最大索引的元素。对于按字符串索引的关联数组,第一个和最后一个元素分别是键值最低和最高的元素。

其中‘最高’和‘最低’基于string comparison。

这与有多少元素无关(显然是15个);受影响的只是索引值的行为。

如果您有更多的元素,那么当您传递89时,您将看到last值发生变化,因为‘90’是比‘9’更高的值,而‘91’是比‘90’更高的值;但是当您传递99时,它会一直保持到900。以此类推。

db<>fiddle

相关文章