2014-11-06 45 views
0

有什麼方法可以讓PL/SQL中關聯數組的值有總和嗎?通常代碼是這樣的:PL/SQL中關聯數組值的總和

FOR i IN a.FIRST .. a.LAST 
    LOOP 
     IF a (i).weight > 0 
     THEN 
      flag := FALSE; 
     END IF; 
    END LOOP; 

但它應該是一種沒有循環和使用總和的方式。

類似:

IF SUM(a.weight) > 0 
THEN 
    flag := FALSE; 
END IF; 

回答

0

其實 - 通常上面的代碼是錯誤的,通過關聯數組循環。嘗試這個。

declare 
    type t_array_rec is record(
     weight number); 
    type t_array is table of t_array_rec index by pls_integer; 
    arr t_array; 
    li_idx int; 
    li_summ int := 0; 
begin 
    arr(1).weight := 100; 
    arr(3).weight:= 200; 
    arr(5).weight := 150; 

    li_idx := arr.first; 
    while (li_idx is not null) loop 
     li_summ := li_summ + nvl(arr(li_idx).weight, 0);   
     li_idx := arr.next(li_idx); 
    end loop; 
    dbms_output.put_line(li_summ); 
end; 

這將計算最小值。你也可以看看SO sorting the assotiative arrays上的另一個答案。

在嵌套表格的情況下,您可以使用table functions. 假設您在數據庫層上具有TTI類型。

CREATE OR REPLACE TYPE TTI as table of int 

可以aggragate它的價值就像所示波紋管

declare 
    arr TTI := TTI(100, 200, 150); 
    li_summ number; 
begin 
    select sum(column_value) into li_summ from table(arr); 
    dbms_output.put_line(li_summ); 
end; 
+0

您好,感謝您的回答。忽略循環的方式,我正在尋找的是具有值的總和。可以說,a(1).weight:= 1;和(2).weight:= 3。有沒有辦法讓這些值的總和(在這裏的例子將是4)沒有循環? – 2014-11-06 08:22:39

+1

我更新了我的答案,以使塊計算總和而不是最大值。對於關聯數組您沒有像嵌套表的表函數那樣的任何選項,唯一的方法是循環訪問數組。 – mikron 2014-11-06 08:52:41

+0

感謝您的更新。我能夠使用更新後的版本,而我的擔心是總結重量值。所以代碼將如下所示:[link](http://example.com)_italic_ ** bold **'聲明 類型t_array_rec是記錄( 重量數字); 類型t_array是由pls_integer的t_array_rec索引表; arr t_array; li_idx int; li_summ int:= 0; begin arr(1).weight:= 100; arr(2).weight:= 200; arr(3).weight:= 150; 從table(arr.weight)中選擇sum(column_value)到li_summ; dbms_output.put_line(li_summ); end;' – 2014-11-17 10:15:46