Normalnie po prostu dołączyłbyś do dwóch stołów.
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
Ponieważ jednak martwisz się o wydajność
- Czy
TEMP_TABLE
naprawdę tymczasowy stół? Jeśli tak, dlaczego? Niezwykle rzadko zdarza się, aby Oracle faktycznie używało tabel tymczasowych, więc podejrzewam, że prawdopodobnie robisz coś nieefektywnego, aby zapełnić tabelę tymczasową. - Dlaczego masz kursor
FOR
pętla do przetwarzania danych zTEMP_TABLE
? Przetwarzanie wiersz po wierszu to najwolniejszy sposób na zrobienie czegokolwiek w PL/SQL, więc generalnie można by tego uniknąć, jeśli martwisz się o wydajność. Z punktu widzenia wydajności, chcesz zmaksymalizować SQL, aby zamiast robić pętlę, która wykonała serię jednowierszowychINSERT
lubUPDATE
operacje, zrobiłbyś jednąINSERT
lubUPDATE
które zmodyfikowały cały zestaw wierszy. Jeśli naprawdę potrzebujesz przetwarzać dane w kawałkach, w grę wchodzą kolekcje PL/SQL i przetwarzanie zbiorcze, ale nie będzie to tak wydajne, jak prosty SQL. - Dlaczego masz
DISTINCT
w zapytaniu względemTEMP_TABLE
? Czy naprawdę spodziewasz się, że będzie duplikatbig_id
? wartości, które nie są błędne? Przez większość czasu ludzie używająDISTINCT
niepoprawnie albo w celu zatuszowania problemów, w których dane zostały nieprawidłowo połączone, albo gdy zmuszasz Oracle do kosztownego sortowania na wypadek, gdyby nieprawidłowe dane zostały utworzone w przyszłości, gdy ograniczenie byłoby bardziej odpowiednim sposobem ochrony.