0

配列から要素を削除する必要があります。array.delete(n)関数を使用しようとしましたが、識別子nからすべての要素が削除されます。正確な要素nを削除する方法は?

たとえば、配列が1 2 3 4 5で、n = 3の場合、削除後は1 245のようになります。

これまでの私のコード:

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;
4

2 に答える 2

4

あなたが説明する行動を再現することはできません。delete文書化されていること以外のことを収集メソッドに実行させることができませんでした。

ただし、コードには、整理された場合に発生する可能性のあるいくつかのエラーがあります。

3まず、 PL / SQL連想配列からキーを持つ要素を削除すると、配列にはキーを持つ要素が何もないことを指摘する必要があります3。残りの値は、ギャップを埋めるために「シャッフル」されません。4削除前にキーを持つ要素があった場合、同じ要素は4その後もキーを持ちます。その結果、jPL / SQL連想配列から要素を削除しv_arrayてから取得しようとするv_array(j)と、「データが見つかりません」というエラーが発生します。v_array.exists(j)存在しない要素を取得する前に、を使用して要素が存在するかどうかを確認する必要があります。

次に、インデックス1の要素は、外側のループの最後の反復の前に削除される可能性があります。これが発生した場合v_array(1)、「データが見つかりません」エラーで失敗します。ループの開始時に割り当て、がであるかより大きい場合は、ループ中にそれらに割り当てることをお勧めしNULLます。v_minv_tmpv_minNULLv_array(j)

v_m最後に、コードはから最小の数値を返すようですv_n。それが、v_m以下であることを確認する価値がv_nあります。そうでない場合、これは意味がありません。

于 2013-03-09T20:06:44.797 に答える
-1

このような組み込みの方法は使えないのではないかと思います。代わりに、元の配列から選択した要素の前後の要素を収集するための一時配列を作成し、一時配列を返す必要があります。

于 2015-03-19T14:01:02.343 に答える