2013-03-09 5 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

+0

한 번에 모두 삭제하지 않습니다. 예를 들어 작동합니다. 선언 된 배열이 1 2 3 4 5이고 n = 2 인 경우, array.delete (n) 배열 뒤에는 두 개의 요소 만 포함됩니다. 1과 2 – kuldarim

+0

하지만 당신의 알고리즘에 관해서는 의미가 있습니다. 문제는 언제 일어나는 것입니까? 내 말은, 익명 블록을 열고 시도해 보면 잘 작동하는 것입니다. 나는 당신의 알고리즘이 문제라고 생각합니다. http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/collection_method.htm – Sebas

답변

3

난 못해를 귀하가 묘사하는 행동을 재현하십시오. 나는 문서화 된 것 이외의 것을하기 위해 delete 수집 방법을 얻을 수 없었다.

그러나 코드에 정돈 중 오류가있을 수 있습니다.

우선, PL/SQL 연관 배열에서 3 키가있는 요소를 삭제하면 배열에 키 3이없는 것으로 나타납니다. 남은 값은 간격을 메우기 위해 '뒤섞이지 않습니다'. 삭제 전에 키가 4 인 요소가있는 경우 동일한 요소에는 나중에 4 키가 있습니다. 결과적으로 PL/SQL 연관 배열 v_array에서 요소 j을 삭제 한 다음 v_array(j)을 얻으려고하면 '데이터 없음'오류가 발생합니다. 존재하지 않는 요소를 가져 오기 전에 v_array.exists(j)을 사용하여 요소가 존재하는지 확인해야합니다.

두 번째로 인덱스 1을 갖는 요소는 외부 루프의 마지막 반복 전에 삭제 될 수 있습니다. 이 경우 '데이터 없음'오류로 v_array(1)이 실패합니다. 루프 시작시 NULLv_minv_tmp에 할당하고 v_minNULL 또는 v_array(j)보다 큰 경우 루프 중에 할당하는 것이 좋습니다.

마지막으로 코드가 에서 가장 작은 숫자 인 v_m을 반환합니다. v_mv_n보다 작거나 같은지 확인하는 것이 좋습니다. 그렇지 않으면 의미가 없습니다.

+0

감사합니다. Luke;) 그래, 나는 당신의 의견대로 v_m 및 v_n 값을 검사해야하지만,이 코드는 나는 pl/SQL을 배우기 때문에 테스트 목적으로 만 사용된다. 하지만 좋은 조언을 주셔서 감사합니다, 지금은 내 문제가 이해;) – kuldarim

-1

나는 이런 식의 내장 된 방법을 사용할 수 없다는 것을 알고 있습니다. 대신에 원래 어레이에서 선택된 하나 이상의 요소를 수집하고 임시 배열을 반환하는 임시 배열을 만듭니다.

관련 문제