Normálně byste se ke dvěma stolům připojili.
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
Protože se však obáváte o efektivitu
- Je
TEMP_TABLE
opravdu dočasný stůl? Pokud ano, proč? Je velmi vzácné, že Oracle skutečně potřebuje používat dočasné tabulky, takže mě to vede k podezření, že pro naplnění dočasné tabulky pravděpodobně děláte něco neefektivního. - Proč máte kurzor
FOR
smyčka pro zpracování dat zTEMP_TABLE
? Zpracování řádků po řádcích je nejpomalejší způsob, jak v PL/SQL něco dělat, takže pokud máte obavy o efektivitu, obecně byste se mu měli vyhnout. Z hlediska výkonu chcete maximalizovat SQL tak, aby namísto provádění smyčky, která provedla sérii jednořádkovýchINSERT
neboUPDATE
operace, udělali byste jedinéINSERT
neboUPDATE
který upravil celou sadu řádků. Pokud opravdu potřebujete zpracovávat data po kouscích, je to místo, kde by mohly hrát kolekce PL/SQL a hromadné zpracování, ale to nebude tak efektivní jako přímé SQL. - Proč máte
DISTINCT
ve vašem dotazu protiTEMP_TABLE
? Opravdu očekáváte, že bude duplicitníbig_id
hodnoty, které nejsou chybné? Lidé většinou používajíDISTINCT
nesprávně, ať už proto, abyste zakryli problémy, kdy byla data nesprávně připojena, nebo kde nutíte Oracle provádět drahé třídění pro případ, že by se v budoucnu vytvořila nesprávná data, kdy by omezení bylo vhodnější způsob, jak se chránit.