为什么VARCHAR2索引的PL/SQL关联数组last方法返回值停在9?
问题根因解释
这个现象是Oracle关联数组的索引排序规则差异导致的,属于符合官方定义的正常行为,并非代码异常:
- 当关联数组索引类型为
VARCHAR2时,索引的排序规则是字符串字典序,last方法返回的是当前数组中按字典序最大的索引值,而非元素总数。
你代码中循环变量i是数字类型,赋值给VARCHAR2索引时会被Oracle隐式转换为字符串,最终生成的索引值为'1'、'2'、...、'9'、'10'、'11'...'15'。按照默认的二进制字典序比较规则,字符'9'的ASCII码远大于'1',因此'9' > '10'、'9' > '15',不管后续插入多少个以'1'开头的字符串索引,当前数组的最大索引永远是'9',所以last方法的返回值固定为9。 - 当关联数组索引类型为
PLS_INTEGER时,索引的排序规则是数值大小排序,last方法返回的是按数值排序最大的索引值,10>9、11>10,因此last会随插入过程正常增长到15,符合你的预期。
补充说明
如果你需要统计VARCHAR2索引关联数组的元素总数,应该调用count方法而非last方法,你可以在测试代码中打印wtabperson.count验证,输出会从1正常增长到15。
如果确实需要使用VARCHAR2索引同时让last的返回值符合数字顺序逻辑,可以将数字索引补前导零转换为固定长度字符串,比如修改赋值逻辑为:
wtabperson(lpad(i, 2, '0')) := 'A' || i;
此时生成的索引为'01'、'02'...'09'、'10'...'15',字典序与数值排序一致,last方法就能正常返回15。
内容的提问来源于stack exchange,提问作者Abenamor
相关产品推荐
相关产品推荐

