Обикновено просто ще съедините двете маси.
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 да извърши скъпо сортиране само в случай, че в бъдеще бъдат създадени неправилни данни, когато ограничението би било по-подходящият начин да се защитите.