Обикновено просто ще съедините двете маси.
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
Тъй като обаче сте загрижени за ефективността
- Е
TEMP_TABLEнаистина ли е временна маса? Ако да защо? Изключително рядко се случва Oracle действително да трябва да използва временни таблици, така че това ме кара да подозирам, че вероятно правите нещо неефективно, за да попълните временната таблица на първо място. - Защо имате курсор
FORцикъл за обработка на данните отTEMP_TABLE? Обработката ред по ред е най-бавният начин да правите каквото и да било в PL/SQL, така че обикновено се избягва, ако сте загрижени за ефективността. От гледна точка на производителността искате да увеличите максимално SQL, така че вместо да правите цикъл, който извършва поредица от един редINSERTилиUPDATEоперации, бихте направили едноINSERTилиUPDATEкойто модифицира цял набор от редове. Ако наистина трябва да обработвате данни на парчета, това е мястото, където PL/SQL колекциите и груповата обработка ще влязат в действие, но това няма да е толкова ефективно, колкото чистия SQL. - Защо имате
DISTINCTвъв вашата заявка срещуTEMP_TABLE? Наистина ли очаквате, че ще има дубликатbig_idстойности, които не са погрешни? През повечето време хората използватDISTINCTнеправилно, или за да прикриете проблеми, при които данните са били обединени неправилно, или където принуждавате Oracle да извърши скъпо сортиране само в случай, че в бъдеще бъдат създадени неправилни данни, когато ограничението би било по-подходящият начин да се защитите.