google_ad_clIEnt = "pub-6430022987645146";google_ad_slot = "6984174763";google_ad_width = 160;google_ad_height = 600;
google_ad_clIEnt = "pub-6430022987645146";google_ad_width = 160;google_ad_height = 600;google_ad_format = "160x600_as";google_cpa_choice = "CAEaCIxsmjE5mLWmUDRQHVAFUAdQLFAMUANQnQJQL1AU";google_color_border = "336699";google_color_bg = "FFFFFF";google_color_link = "0000FF";google_color_text = "000000";google_color_url = "008000";
以前稱為INDEX BY表格的聯合數組就一直是PL/SQL的一項功能。它們是稀松數組,這意味著它們只存儲所裝載的元素,不會為中間目錄值保留空間。然而,它們的一個原始局限在於下標(即INDEX BY的“目錄”)必須為整數。
Oracle 9i第2版擴充了這一功能,允許以文字為下標。這使得聯合數組更像是其它語言,如Perl中的雜湊表格。
為說明文字字符串可成為目錄值,簡單使用INDEX BY VARCHAR2(用最大長度完成),不要使用慣常的INDEX BY BINARY_INTEGER。下面是一個實例:
TYPE counters_type IS TABLE OF BINARY_INTEGER
INDEX BY VARCHAR2(20);
region_counts?
COUNTERS_TYPE;
要處理聯合數組的單個元素,使用一個VARCHAR2變量或文字作下標。下面的語句更新了region_counts的一個元素。
region_counts(''Southwest'') := region_counts(''Southwest'') + 1;
要遍歷一個聯合數組的所有元素,使用集合方法.FIRST、 .NEXT(''key'')、 .PRIOR(''key'')和.LAST,如下面的代碼所示(假定v_sub以前聲明為VARCHAR2)。
v_grand_total := 0;
v_sub := region_counts.FIRST;
WHILE v_sub IS NOT NULL LOOP
v_grand_total := v_grand_total + region_counts(v_sub);
v_sub := region_counts.NEXT(v_sub);
END LOOP;
直接使用文字可簡化你的代碼。在前面的版本中,程序可能使用一個兩列的INDEX BY數組:一列存儲地區名稱,另一列存儲總數量。為更新計數器,代碼首先在第一列中搜索地區代碼。一旦發現正確的下標,它將更新總數列中的對應項目。
列表A說明了上述聯合數組技巧。它聲明一個叫做counters_type的數組類型,然後建立一個那種類型的稱做region_counts的實例。增加數據、進行更新、並繼續用文字作下標進行處理。
即使一個聯合數組能夠使用集合方法,它也不能像嵌套表格一樣作為列存儲在數據庫中。在PL/SQL程序中,當決定用哪種集合類型進行臨時存儲時,記住這一點。