本文介紹了為什么由VARCHAR2索引的關聯數組存儲的元素不超過9個的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
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
這篇關于為什么由VARCHAR2索引的關聯數組存儲的元素不超過9個的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,