2013-03-09 195 views
0

我需要從數組中刪除元素。我試圖使用array.delete(n)函數,但它刪除標識符n的所有元素。如何刪除確切的元素n?pl/sql從數組中刪除元素

例如,如果陣列是1 2 3 4 5,並且n = 3,刪除後它應該看起來像以下1 2 4 5

我迄今代碼:

DECLARE 
    /* declare type array */ 
    TYPE number_index_by_number IS TABLE OF number INDEX BY binary_integer; 

    v_n NUMBER := &sv_n; 
    v_m NUMBER := &sv_m; 
    v_min Number; 
    v_tmp Number; 
    v_array number_index_by_number; 
    v_sorted_array number_index_by_number; 
begin 
    for i in 1..v_n 
    loop 
    v_array(i) := dbms_random.value(1,1000); 
    end loop; 
    for j in v_array.first..v_array.last 
    loop 
    DBMS_OUTPUT.put_line('v_array('||j||') :'||v_array(j)); 
    end loop; 
    <<i_loop>> for i in 1..v_m 
    loop 
    /*set first array value to variable min*/ 
    v_min := v_array(1); 
    v_tmp := 1; 
    <<j_loop>> for j in v_array.first..v_array.last 
    loop 
     DBMS_OUTPUT.put_line('v_array('||j||') :'||v_array(j)); 
     if (v_min > v_array(j)) THEN 
     begin 
      v_min := v_array(j); 
      v_tmp := j; 
      DBMS_OUTPUT.put_line(j); 
     end; 
     end if; 
    end loop; 
    /*problem is in at this line*/ 
    v_array.delete(v_tmp); 
    v_sorted_array(i) := v_min; 
    end loop; 
    for i in v_sorted_array.first..v_sorted_array.last 
    loop 
    DBMS_OUTPUT.put_line('v_sorted_array('||i||') :'||v_sorted_array(i)); 
    end loop; 
end; 
+0

你有什麼症狀一次性刪除v_array? – Sebas 2013-03-09 19:08:32

+0

它不會一次全部刪除。它的作用就像例如。如果聲明的數組是1 2 3 4 5,且n = 2,則在array.delete(n)數組僅包含兩個元素之後。 1和2 – kuldarim 2013-03-09 19:13:54

+0

,但它對你的算法有意義。問題是什麼時候發生的?我的意思是,只要打開一個匿名塊並嘗試一下,就會發現它工作正常。我認爲你的算法是問題。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/collection_method.htm – Sebas 2013-03-09 19:20:33

回答

3

我不能重現你描述的任何行爲。我無法使delete收集方法做任何記錄以外的事情。

不過,也有代碼中的一些錯誤,可能與正在收拾做。首先,我應該指出,如果你從PL/SQL關聯數組中刪除了一個鍵爲3的元素,那麼數組中的3就沒有任何東西。剩下的價值不會「洗牌」以彌補差距。如果在刪除之前存在具有密鑰4的元素,則相同的元素之後仍將具有密鑰4。因此,如果您從PL/SQL關聯數組j中刪除元素v_array,然後嘗試獲取v_array(j),則會出現「找不到數據」錯誤。在嘗試獲取不存在的元素之前,應使用v_array.exists(j)檢查元素是否存在。

其次,索引1處的元件可能會被外部循環的最後一次迭代之前刪除。如果發生這種情況,v_array(1)將失敗並顯示'找不到數據'錯誤。如果v_minNULL或大於v_array(j),則在循環開始時將NULL分配給v_minv_tmp並在循環期間分配給它們會更好。

最後,看來你的代碼v_n返回v_m最小的號碼。值得驗證的是v_m小於或等於v_n,否則這是沒有意義的。

+0

感謝盧克;)是的,我同意你的看法,v_m和v_n值必須按照你所說的來檢查,但是這個代碼僅用於測試目的,因爲我正在學習pl/sql。但是,感謝您的好建議,現在我明白我的問題了;) – kuldarim 2013-03-10 07:17:38

-1

我擔心你不能使用像這樣的內置方法。 而不是你應該創建一個臨時數組來收集之前和之後從原始數組中選擇的元素,並返回臨時數組。