Normalmente, você apenas juntaria as duas tabelas.
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
Como você está preocupado com a eficiência, no entanto
- É
TEMP_TABLE
realmente uma tabela temporária? Se sim, por quê? É extremamente raro que o Oracle realmente precise usar tabelas temporárias, o que me leva a suspeitar que você provavelmente está fazendo algo ineficiente para preencher a tabela temporária em primeiro lugar. - Por que você tem um cursor
FOR
loop para processar os dados deTEMP_TABLE
? O processamento linha por linha é a maneira mais lenta de fazer qualquer coisa em PL/SQL, portanto, geralmente seria evitado se você estiver preocupado com a eficiência. Do ponto de vista do desempenho, você deseja maximizar o SQL para que, em vez de fazer um loop, faça uma série deINSERT
de linha única ouUPDATE
operações, você faria um únicoINSERT
ouUPDATE
que modificou um conjunto inteiro de linhas. Se você realmente precisa processar dados em partes, é aí que as coleções PL/SQL e o processamento em massa entram em ação, mas isso não será tão eficiente quanto o SQL direto. - Por que você tem o
DISTINCT
em sua consulta emTEMP_TABLE
? Você realmente espera que hajabig_id
duplicado valores que não estão errados? Na maioria das vezes, as pessoas usamDISTINCT
incorretamente para encobrir problemas em que os dados foram unidos incorretamente ou onde você está forçando a Oracle a fazer uma classificação cara apenas no caso de dados incorretos serem criados no futuro, quando uma restrição seria a maneira mais apropriada de se proteger.