Zurücksetzen eines Assoziativen Arrays in PL/SQL?
Dies ist einer dieser "es muss einen besseren Weg" Fragen. Lassen Sie mich das problem aus, ich gebe dir dann meine gehackt Lösung, und vielleicht können Sie vorschlagen, eine bessere Lösung. Danke!
Nehmen wir diese kleinen Leckerbissen von PL/SQL
DECLARE
TYPE foo_record IS RECORD (foo%type, bar%type);
TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
arr_foos foo_records;
CURSOR monkeys is SELECT primates FROM zoo;
row_monkey monkeys%rowtype;
BEGIN
FOR row_monkey IN monkeys loop
/*
at this point in each iteration I need to have the associative array
arr_foos in its original state. if this were java, I'd declare it
right here and its scope would be limited to this iteration. However,
this is not java, so the scope of the array is effectively global and
I can't have one iteration's data meddle with the next.
*/
null;
END LOOP;
END;
Macht das Sinn? Ich im Grunde benötigen, um es zurückzusetzen, um etwas. Wenn es eine Nummer, die bei null beginnt, konnte ich nur sagen, Zahl:=0; am Anfang jeder iteration und mit ihm getan werden. Aber dies ist nicht eine Zahl, es ist eine Art, die ich kann nur reset mit einem sauberen,: =0.
Sowieso, auf meinem hack:
DECLARE
TYPE foo_record IS RECORD (foo%type, bar%type);
TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
arr_foos foo_records;
arr_foos_reset foo_records;
CURSOR monkeys is SELECT primates FROM zoo;
row_monkey monkeys%rowtype;
BEGIN
FOR row_monkey IN monkeys loop
arr_foos := arr_foos_reset;
null;
END LOOP;
END;
Ich dachte, dass wenn ich verwalten können, um zu bewahren, ein Mitglied des gleichen Typs in einem originalen Zustand ist, dann kann ich nur die working-variable zurück auf das, was der Wert des Originals. Und, erstaunlich genug, funktioniert es (denke ich.) Aber es muss einen besseren Weg geben. Kann mir jemand helfen?
T'anks!
- Geringfügige nitpick: Sie brauchen nicht zu erklären
row_monkey monkeys%rowtype;
. Eine cursor-FOR-Schleife wie diese nicht die Erklärung für Sie, und beschränkt sich auf die Schleife. In diesem code wird die variable deklariert ist doppelt, der innere version Schatten der Außenmauer. Es ist nicht ein problem, obwohl ich dachte, ich möchte hinzufügen das für jemand anderes zu Lesen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg:
Andere Weg ist, um die variable zu deklarieren innerhalb der
FOR
Schleife. Auf diese Weise wird es neu erstellt werden und für jeden Durchgang.Wie diese:
Sind Sie gehen, um das Lesen von Daten von zoo-Tabelle in eine Sammlung? Dann gibt es einen besseren Weg:
Bulk collect automatisch löscht die Sammlung vor dem abrufen, und es arbeitet schneller, dann Lesen Zeile für Zeile in der Schleife. Leider funktioniert es N arbeiten mit Datensätzen, so müssen Sie mehrere PL/SQL-Tabellen für jedes Feld.
Weitere Informationen finden Sie hier: Abrufen von Abfrage-Ergebnissen in die Sammlungen mit der BULK COLLECT-Klausel