Normalt ville du bare slutte dig til de to borde.
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 du er bekymret for effektivitet, dog
- Er
TEMP_TABLE
virkelig et midlertidigt bord? Hvis ja, hvorfor? Det er overordentlig sjældent, at Oracle faktisk har brug for at bruge midlertidige tabeller, så det får mig til at mistænke, at du sandsynligvis gør noget ineffektivt for at udfylde den midlertidige tabel i første omgang. - Hvorfor har du en markør
FOR
loop for at behandle dataene fraTEMP_TABLE
? Række-for-række-behandling er den langsomste måde at gøre noget på i PL/SQL, så det ville generelt undgås, hvis du er bekymret for effektivitet. Fra et præstationssynspunkt ønsker du at maksimere SQL, så i stedet for at lave en løkke, der lavede en række af en rækkeINSERT
ellerUPDATE
operationer, ville du lave en enkeltINSERT
ellerUPDATE
der ændrede et helt sæt rækker. Hvis du virkelig har brug for at behandle data i bidder, er det her, PL/SQL-samlinger og bulkbehandling vil komme til at spille, men det vil ikke være så effektivt som direkte SQL. - Hvorfor har du
DISTINCT
i din forespørgsel modTEMP_TABLE
? Forventer du virkelig, at der vil være dubletbig_id
værdier, der ikke er fejlagtige? Det meste af tiden bruger folkDISTINCT
forkert enten for at dække over problemer, hvor data er blevet sammenføjet forkert, eller hvor du tvinger Oracle til at udføre en dyr sortering, bare hvis der bliver oprettet forkerte data i fremtiden, når en begrænsning ville være den mere passende måde at beskytte dig selv på.