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

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