Normalerweise würden Sie einfach an den beiden Tischen teilnehmen.
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
Da Sie sich jedoch Gedanken über die Effizienz machen
- Ist
TEMP_TABLE
wirklich eine temporäre Tabelle? Wenn ja warum? Es kommt äußerst selten vor, dass Oracle tatsächlich temporäre Tabellen verwenden muss, sodass ich vermute, dass Sie wahrscheinlich etwas Ineffizientes tun, um die temporäre Tabelle überhaupt zu füllen. - Warum haben Sie einen Cursor
FOR
Schleife, um die Daten vonTEMP_TABLE
zu verarbeiten ? Die zeilenweise Verarbeitung ist der langsamste Weg, irgendetwas in PL/SQL zu tun, daher würde es im Allgemeinen vermieden werden, wenn Sie sich Sorgen um die Effizienz machen. Aus Performance-Sicht möchten Sie SQL so maximieren, dass statt einer Schleife eine Reihe von einzeiligenINSERT
ausgeführt wird oderUPDATE
Operationen, würden Sie ein einzelnesINSERT
ausführen oderUPDATE
die eine ganze Reihe von Zeilen geändert hat. Wenn Sie Daten wirklich in Blöcken verarbeiten müssen, kommen hier PL/SQL-Sammlungen und Massenverarbeitung ins Spiel, aber das ist nicht so effizient wie reines SQL. - Warum haben Sie den
DISTINCT
in Ihrer Abfrage gegenTEMP_TABLE
? Erwarten Sie wirklich, dass es doppeltebig_id
gibt Werte, die nicht falsch sind? Meistens verwenden die LeuteDISTINCT
falsch, entweder um Probleme zu vertuschen, bei denen Daten falsch verknüpft wurden, oder wo Sie Oracle zwingen, eine teure Sortierung durchzuführen, nur für den Fall, dass in Zukunft falsche Daten erstellt werden, wenn eine Einschränkung der angemessenere Weg wäre, sich zu schützen.