Então : veja que tanto a EXTERNAL TABLE quanto a operação de MERGE que eu 
recomendo como sendo (e na Esmagadora maioria das vezes é MESMO) mais Rápida 
são built-ins, nativos DO DATABASE, então por isso se por um lado te dão a 
performance TOP (internamente elas são código C , ** compilado ** dentro do 
database, e que usa & abusa dos hooks internos do database, coisas essas 
inerentemente VEDADAS ao teu código Pl/SQL coitadinho INTERPRETADO e EXTERNO), 
por Outro lado são fechados e algo inflexíveis, fazem o que fazem e cabou .... 
Veja em 
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:6618304976523#6623196184466
 um pouco sobre as questões de performance, em 
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1500471500346067777
 a opção de log de erros e em 
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:35615502072484#35632246331433
 os detalhes sobre qtdade de registros processados , e decida se essas coisas 
te atendem OU se realmente vc quer trocar performance e eficiência por controle 
e log detalhado...
 SE quiser/precisar optar pela opção menos performática porém mais controlada 
de fazer o processamento EXTERNAMENTE ao database, sem ser por um só comando 
SQL, AUTOMATICAMENTE vc vai ter que escrever mais código e VAI ter que se 
preocupar com limites dos resultados.... E que fique CLARO, esses limites (que 
incluiriam o LIMIT da cláusula de COLLECT, e tamanhos de arrays) não são 
GENÉRICOS, eles dependem fundamentalmente do SEU ambiente, de quanta RAM vc tem 
livre, da capacidade/poder de processamento... É TOTALMENTE POR SUA CONTA, 
portanto, testar no SEU ambiente e ver até onde vc pode chegar sem queda de 
performance e sem erros ORA-40xxx de falta de recursos : os valores de 100 
registros coletados por vez que vc vai encontrar tanto na documentação quanto 
(principalmente) na maioria dos links que goolglar e/ou que vou indicar) são 
simplesmente um valor TÍPICO, mas nem de longe isso vai ser Ótimo no seu 
ambiente...
 
 Eu ** IMAGINO ** que a opção menos ruim de processamento PL/SQL aonde vc teria 
a opção de controle detalhado/log detalhado de cada registro seja a external 
table sendo joineada num cursor PL/SQL com a tabela a atualizar, sendo lida com 
BULK e o UPDATE é em múltiplos registros de uma vez com FORALL - veja 
http://www.morganslibrary.org/reference/plsql/array_processing.html , 
http://ksadba.wordpress.com/2008/06/16/updating-millions-of-rows-merge-vs-bulk-collect/
 , 
http://www.oracle-base.com/articles/9i/bulk-binds-and-record-processing-9i.php 
(e seus links do 10g) e http://psoug.org/reference/array_processing.html para 
refs/exemplos, BEM COMO os manuais Oracle correspondentes.... 
 
 REPITO, o que não faz sentido é vc ler 2x o arquivo de texto, sendo uma vez 
pra carregar na GTT e Outra vez para processar a GTT -  talvez a exceção seja 
se vc quiser ter o log detalhado da leitura do arquivo-texto (digamos, log dos 
registros inválidos) : como vc aprendeu, o log da external table em si é o que 
é, no formato e na localização que é : CASO realmente precise muito de algo 
diferente E não seja viável ler/transformar o log da external, não tem jeito é 
engolir o sapo e a GTT sem tempero, sim ... Aí o BULK/FOR ALL vai usar a GTT ao 
invés da external...
 
   []s
   
     Chiappa

Responder a