Bem, imho a pessoa ** não ** vai ter que "usuário vai ter que analisar o log do concurrent e depois o log do LOADER/external table", pois os logs detalhados que são gerados para a external table são em caso de EXCEÇÕES (ie, o BADFILE eo DISCARDFILE), enquanto o LOGFILE propriamente dito tem poucas e curtas msgs ...Por exemplo, veja abaixo o logfile de uma query bem-sucedida (sem exceções) numa external table : /tmp$ cat POP_EXT_3688.log LOG file opened at 04/17/14 13:08:54 Field Definitions for table POP_EXT Record format DELIMITED BY NEWLINE Data in file has same endianness as the platform Rows with all null fields are accepted Fields in Data Source: CITY CHAR (255) Terminated by "," Trim whitespace same as SQL Loader COUNTRY CHAR (255) Terminated by "," Trim whitespace same as SQL Loader POPULATION CHAR (255) Terminated by "," Trim whitespace same as SQL Loader /tmp$
==> é informação técnica INTERNA, absolutamente Não Interessante para o usuário-final, yep ?? Então imho vc simplesmente teria uma tela customizada aonde, SE / QUANDO o usuário precisar, ele lê o BADFILE e o DISCARDFILE, Acho que é isso que o usuário precisaria ter... Já sobre o ponto de verificar se o registro que está vindo existe, e gerar uma mensagem se não existir : não sei se o MERGE aceita, mas veja lá se vc não poderia simplesmente pedir pro MERGE fazer o INSERT duma string numa tabela de erros, que depois vc apresentaria na tela de log pro usuário... Eu ACHO que não daria, mas veja lá... Sobre a questão de leitura dos dados e comparação, sim : para evitar o trabalho de carregar o arquivo-texto pra uma GTT antes de poder acessar, é o que vc falou, seria um OUTER JOIN, sim: for r in (SELECT dadosdesejados FROM tabelareal A, externaltable B WHERE A.colunachave (+) = B.colunachave loop .... IF r.colunachave IS NULL then -- não houve match gera uma mensagem... claro, o PL/SQL sempre trabalha logicamente registro-a-registro mas OBVIAMENTE vc colocaria os registros lidos e a updatear/inserir num ARRAY, é isso que faz a cláusula de BULK COLLECT e o FORALL .... yes ?? Se REALMENTE vc precisa gerar uma ação espeífica para cada registro processado, aí a solução de apenas SQL (que sria o MERGE) não atende, aí toca a aceitar a performance provavelmente inferior e programar em PL/SQL, sim.... E o último ponto, sobre a falta de índice na external table - veja, eu entendo que a. a tabela real vai ser ** muito MAIOR ** que o arquivo-texto com os dados a carregar E QUE necessariamente os dados TODOS que estarão no arquivo-texto TEM QUE SER PROCESSADOS do primeiro ao último, Integralmente, sim ??? Notar que o índice só é positivo para a performance quando vc quer recuperar UM, ou no máximo uma pequena FRAÇÃO do todos, aí o fato de vc precisar ler o arquivo-texto TODINHO inviabilizaria o uso de índice, okdoc ??? Por isso que a Oracle não colocou ainda a opção de indexação em external tables, tipicamente esses caras são dados a carregar/procesar, TEM que ser lidos integralmente, não compensaria para a performance..... E o fato da tabela real de destino ser (imagino) MUITO MUITO maior e o fato de que é nela que vc tem que procurar para ver se o valor lido da external existe ou não indicaria que o índice útil aí seria é na TABELA REAL, que é Muito maior E é onde queremos pesquisar apenas uma linha, yep ?? []s Chiappa