Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Cursor aninhado em um cursor


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 de TEMP_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 de INSERT de linha única ou UPDATE operações, você faria um único INSERT ou UPDATE 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 em TEMP_TABLE ? Você realmente espera que haja big_id duplicado valores que não estão errados? Na maioria das vezes, as pessoas usam DISTINCT 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.