Bearbeitet zur besseren Klarstellung:
Hinzugefügt am 28.01.09: Ich habe den Code vereinfacht, um ihn leicht zu erklären, aber die SELECT-Anweisungen sind sehr lang und kompliziert, und die zweite ist abhängig von der ersten, d.h. nachdem der erste Cursor durchlaufen wurde und die Inserts erstellt wurden, betrachtet die zweite SELECT tatsächlich die ersten Inserts als Teil des WHERE-Klausels.
Deshalb muss ich die Schleife mehr als einmal verwenden und die SELECT-Anweisungen nicht irgendwie kombinieren. Ich muss sie ausführen, wenn ich sie aufrufe, in der Reihenfolge, in der ich sie aufrufen möchte. Das bringt mich zurück zu meiner ursprünglichen Frage: Gibt es überhaupt eine Möglichkeit, eine Schleife mit einem anderen Cursor wiederzuverwenden?
Nochmals vielen Dank.
Ich erstelle ein Paket (Oracle 10), für das ich 4 verschiedene SELECT-Anweisungen (eventuell noch mehr) habe, für die ich jeweils einen Cursor erstelle und meine Daten abrufe. Normalerweise nehme ich die Daten und erstelle eine For-Schleife und alles läuft gut.
Mein Problem ist, dass ich 4 verschiedene SELECT-Anweisungen habe, aber ich möchte die Schleife wiederverwenden, damit Cursor c2, sowie c3 und c4 dieselbe Schleife nutzen können. All diese Cursor rufen verschiedene Informationen aus sehr unterschiedlichen SELECT-Anweisungen ab, aber sie werden alle mit meiner INSERT-Anweisung in der Schleife in dieselbe Tabelle eingefügt. Außerdem kann ich nicht alle SELECT-Anweisungen zusammenführen, sie müssen in der Reihenfolge mit einem COMMIT nach jeder Schleife ausgeführt werden.
Ich habe unten ein Beispiel mit 4 Schleifen erstellt, aber wie Sie sehen können, sind sie alle gleich, der einzige Unterschied ist: Für r in c1 loop, Für r in c2 loop...
cursor c1 is select info_a, info_b from table_x where info_g = 77;
cursor c2 is select info-a, info_b from table_x where info_g = 88;
cursor c3 is select info-a, info_b from table_y where info_j = 88;
cursor c4 is select info-a, info_b from table_y where info_j = 99;
Begin
For r in c1 loop
insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
end loop;
commit;
For r in c2 loop
insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
end loop;
commit;
For r in c3 loop
insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
end loop;
commit;
For r in c4 loop
insert into fun_table (good_info, boring_info) values (r.info_a, r.info-b);
end loop;
commit;
end;
Hoffe das ergibt mehr Sinn und danke
Ich habe bearbeitet und dann kamen einige Antworten rein.. entschuldigung. Das Original sah ungefähr so aus:
cursor c1 is select some_info, other_info from some_table where where some_thing = 'xyz';
cursor c2 is select some_info, other_info from some_table where where some_thing = 'abc';
For r in c1 loop
insert into fun_table (good_info, boring_info) values (r.some_info, r.other_info);
end loop;