pl/sql-entfernen element aus array
Muss ich entfernen element aus dem array. Ich habe versucht, verwenden Sie array.löschen(n) - Funktion, aber es löscht alle Elemente aus id n. Wie löschen Sie einfach die exakte element n ?
Beispielsweise, wenn array 1 2 3 4 5 und n = 3, nach dem löschen sollte es Aussehen wie folgt vor: 1 2 4 5.
Mein code bisher :
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;
- welche Symptome haben Sie von v_array gelöscht werden, alle auf einmal?
- es doesn `t löschen Sie alle auf einmal. Es funktioniert wie zum Beispiel. Wenn deklariertes array ist 1 2 3 4 5 und n = 2, nach dem array.löschen(n) - array enthält nur zwei Elemente. 1 und 2
- aber es Art von Sinn macht in Bezug zu Ihrem Algorithmus. Die Frage ist, Wann ist es passiert? Ich meine, nur öffnen Sie einen anonymen block, und versuchen Sie es, Sie werden sehen, es funktioniert. Ich denke, dass Ihr Algorithmus ist das problem. docs.oracle.com/cd/B19306_01/appdev.102/b14261/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich nicht reproduzieren, das Verhalten, die Sie beschreiben. Ich konnte nicht die
delete
Methode der Datenerhebung um etwas anderes zu tun als das, was es ist dokumentiert, das zu tun.Allerdings gibt es ein paar Fehler in Ihrem code, der könnte mit aufgeräumt.
Zunächst sollte ich darauf hinweisen, wenn Sie ein element löschen mit der Taste
3
aus einer PL/SQL assoziative Arrays, da ist dann nichts mit Schlüssel3
im array. Die restlichen Werte nicht zu "mischen" unten, um die Lücke zu füllen. Wenn es ein element mit Schlüssel4
vor dem löschen, das gleiche element noch Schlüssel4
danach. Als Ergebnis, wenn Sie das element löschenj
aus einer PL/SQL assoziative Arraysv_array
und dann versuchen zu bekommenv_array(j)
erhalten Sie eine 'no data found' - Fehler. Sie sollten überprüfen, um zu sehen, ob das element vorhanden ist, mitv_array.exists(j)
, bevor der Versuch, ein nicht vorhandenes element.Zweitens, das element mit dem index 1 gelöscht, bevor die Letzte iteration der äußeren Schleife. Wenn dies geschieht,
v_array(1)
fehl mit 'keine Daten gefunden' - Fehler. Es wäre besser zuordnenNULL
zuv_min
undv_tmp
am Anfang der Schleife, und weisen Sie während der Loop-Schleife, wennv_min
istNULL
oder größer alsv_array(j)
.Schließlich, es scheint dein code gibt die
v_m
kleinsten zahlen ausv_n
. Es würde sich lohnen, zu überprüfen, dassv_m
ist weniger als oder gleichv_n
werden, sonst macht das keinen Sinn.Ich bin affraid können Sie eine integrierte Methode wie diese.
Stattdessen sollte man erstellen Sie ein temp-array zum sammeln der Elemente, vor und danach wird das ausgewählte eine von den original-array, und die temp-array.