0

我需要从数组中删除元素。我曾尝试使用 array.delete(n) 函数,但它会删除标识符 n 中的所有元素。如何只删除确切的元素 n ?

例如,如果数组是 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;
4

2 回答 2

4

我无法重现您描述的任何行为。除了记录在案的事情之外,我无法让delete收集方法做任何事情。

但是,您的代码中有一些错误可能与整理有关。

首先,我应该指出,如果你3从 PL/SQL 关联数组中删除一个带键的元素,那么数组中就没有任何带键的元素3。剩余的值不会“洗牌”以填补空白。如果4在删除之前有一个带有键的元素,那么相同的元素在删除之后仍然有键4。因此,如果您j从 PL/SQL 关联数组中删除元素v_array,然后尝试获取v_array(j),您将收到“未找到数据”错误。v_array.exists(j)在尝试获取不存在的元素之前,您应该使用 , 检查该元素是否存在。

其次,索引为 1 的元素可能会在外循环的最后一次迭代之前被删除。如果发生这种情况,v_array(1)将失败并出现“未找到数据”错误。最好在循环开始时分配和NULL,并在循环期间分配给它们 if is或大于。v_minv_tmpv_minNULLv_array(j)

最后,您的代码似乎v_mv_n. 值得验证v_m小于或等于v_n,否则这是没有意义的。

于 2013-03-09T20:06:44.797 回答
-1

我担心你不能使用这样的内置方法。而不是你应该创建一个临时数组来收集原始数组中所选元素之前和之后的元素,并返回临时数组。

于 2015-03-19T14:01:02.343 回答