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_TABLEwirklich 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
FORSchleife, um die Daten vonTEMP_TABLEzu 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 einzeiligenINSERTausgeführt wird oderUPDATEOperationen, würden Sie ein einzelnesINSERTausführen oderUPDATEdie 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
DISTINCTin Ihrer Abfrage gegenTEMP_TABLE? Erwarten Sie wirklich, dass es doppeltebig_idgibt Werte, die nicht falsch sind? Meistens verwenden die LeuteDISTINCTfalsch, 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.