Tagged: Condição Usando sql loader
- This topic has 7 replies, 3 voices, and was last updated 5 years, 9 months ago by gioracle.
-
AuthorPosts
-
31 de janeiro de 2019 at 8:36 am #114545sergiomsoParticipant
Estou com uma duvida, já pesquisei vários exemplos bem e não encontrei nada.
Tenho um arquivo .txt que é disponibilizado para carregar com sql loader. Só que eu precisaria carregar com a condição de pegar somente as primeiras letras. Por ex.. Queria carregar somente todas as linhas que começam com “PES”. Será o o SQL LOADER da para fazer isso?DEPENDENTE DADOS
PES0007200844 …………..
FUN0007200844 …………..
FOB0007200844 …………..
DEP0007200844 …………..
ASM0007200844 …………..
CNH0007200844 …………..
PES0007294550 …………..
FUN0007294550 …………..
FOB0007294550 …………..
ASM0007294550 …………..
CNH0007294550 …………..
CNH0007294550 …………..
PES0007659413 …………..
FUN0007659413 …………..
IDI0007659413 …………..
FOB0007659413 …………..
DEP0007659413 …………..
DEP0007659413 …………..
ASM0007659413 …………..
CNH0007659413 …………..
CNH0007659413 …………..
PES0007691776 …………..
FUN0007691776 …………..
IDI0007691776 …………..
IDI0007691776 …………..
FOB0007691776 …………..
FOB0007691776 …………..
DEP0007691776 …………..
DEP0007691776 …………..
DEP0007691776 …………..
ASM0007691776 …………..
CNH0007691776 …………..
CNH0007691776 …………..31 de janeiro de 2019 at 2:35 pm #114689José Laurindo ChiappaModeratorBlz ? Então, COM CERTEZA tem como sim : uma das opções que nos vêm à cabeça de imediato é a cláusula WHEN no controlfile, as linhas que não obedecem ao WHEN são simplesmente puladas/ignoradas, vide https://asktom.oracle.com/pls/apex/asktom.search?tag=sqlloader-with-multiple-whens-is-rejecting-all-rows … Imagino que seria algo do tipo WHEN SUBSTR(nomedacoluna, 1, 3) = ‘PES’, algo assim….
E perceba que necessariamente vc TEM que indicar um arquivo de rejeição na hora de chamar o sqlldr, afaik…Porém, não deixe de checar TAMBÉM a possibilidade de fazer essa carga via SQL, com a funcionalidade da EXTERNAL TABLE : com ela, vc pode fazer um SELECT direto em cima de um arquivo-texto que esteja disponível/acessível para o servidor Oracle, aí com ele a sua tarefa ia ser Ridiculamente Fácil, ia ser :
INSERT INTO tabelareal (select * from externaltablequelêoarquivotexto where SUBSTR(nomedacoluna, 1, 3) = ‘PES’));
Dá uma estudada na Documentação e em link de referência como https://asktom.oracle.com/pls/apex/asktom.search?tag=sqlloader-versus-external-table , veja lá se essa opção te ajuda….
[]s
Chiappa
1 de fevereiro de 2019 at 8:50 am #115115sergiomsoParticipantCHIAPPA,
BOM DIA
Obrigado pelos esclarecimentos e pelas experiências.
Tentei usar esse (WHEN) apoio más não rolou. Só aceita se for = ou <>
Apresenta para mim a mensagem abaixo:SQL*Loader-350: Syntax error at line 8.
Expecting = or “<>”, found “(“.Não é possivel que o SQL LOADER não apresenta esta condição (LIKE) de ler o .txt buscar e inserir somente as linhas que eu quero.
1 de fevereiro de 2019 at 9:55 am #115116José Laurindo ChiappaModeratorNão : veja lá na minha resposta que a sugestão foi o WHEN SUBSTR(nomedacoluna, 1, 3) = ‘PES’ , não falei ** nada ** de LIKE, não… Dá um look na Documentação mas até onde sei o WHEN só aceita operadores simples, ie, igual, maior, menor, e diferente…
No seu caso específico não vejo problema algum, vc PODE usar uma função que extraia a sub-string que vc quer e faça a comparação nessa substring, como a SUBSTR faz…. INCLUSIVE, lembre que existem SIM outras funções que permitiem operações mais complexas, como REGEXP por exemplo…
Já em casos onde REALMENTE seja Obrigatório usar algum recurso diferente da linguagem SQL que não comparação simples, como eu disse vá pra opção de EXTERNAL TABLE, se o arquivo puder ser disponibilizado para o servidor Oracle de alguma forma…[]s
Chiappa
1 de fevereiro de 2019 at 10:39 am #115134José Laurindo ChiappaModeratorPra não ficar só no blablablá, eis um exemplo meu : no caso , estou fazendo o teste com uma versão relativamente antiga de banco (10g), que notadamente tem problemas com chamadas de função, então vou apelar para a notação Posicional – REPITO, porém, que vc TEM QUE CONSULTAR A DOCUMENTAÇÃO pra ver o que é ou não aceito na SUA VERSÃO, sim sim sim ??
Isso dito, segue :=> crio a tabela :
scott@DESENV:SQL>create table TAB_TESTE_LOAD (
2 CODIGO varchar2(33),
3 ORDEM number(2),
4 DEPT varchar2(50)
5 );Tabela criada.
=> olha lá meu arquivo de dados E meu controlfile :
C:\Users\Chiappa>type TAB_TESTE_LOAD.txt
PES0007200844,11,Sales
FUN0007200844,23,Technology
FOB0007200844,44,Marketing
DEP0007200844,22,Marketing
ASM0007200844,77,Accounting
CNH0007200844,88,Sales
PES0007294550,11,Marketing
FUN0007294550,10,Sales
FOB0007294550,45,Sales
ASM0007294550,55,Technology
CNH0007294550,66,Technology
CNH0007294550,77,Technology
PES0007659413,90,TechnologyC:\Users\Chiappa>
C:\Users\Chiappa>type TAB_TESTE_LOAD.ctl
load data
characterset WE8ISO8859P15
truncate
into table TAB_TESTE_LOAD
when (1:3) = ‘PES’
fields terminated by “,”
( CODIGO, ORDEM, DEPT)C:\Users\Chiappa>
==> okdoc, vamos executar o loader :
C:\Users\Chiappa>sqlldr userid=scott/tiger@desenv control=TAB_TESTE_LOAD.ctl data=TAB_TESTE_LOAD.txt log=TAB_TESTE_LOAD.log bad=TAB_TESTE_LOAD.bad discard=TAB_TESTE_LOAD.dis
SQL*Loader: Release 10.2.0.5.0 – Production
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Atingido o ponto de commit – contagem de registros lógicos 13
C:\Users\Chiappa>
==> Olha lá o resultado desejado, SOMENTE AS LINHAS QUE COMEÇAM COM ‘PES’ FORAM CARREGADAS :
scott@DESENV:SQL>select * from TAB_TESTE_LOAD;
CODIGO ORDEM DEPT
PES0007200844 11 Sales
PES0007294550 11 Marketing
PES0007659413 90 Technologyscott@DESENV:SQL>
okdoc ??
[]s
Chiappa
1 de fevereiro de 2019 at 4:40 pm #115265sergiomsoParticipantCHIAPPA,
Sensacional.
Muito obrigado pelo apoio, me ajudou bastante. Eu testei aqui e funcionou usando esta condição.
Obrigado.
1 de fevereiro de 2019 at 6:04 pm #115297José Laurindo ChiappaModeratorBlz, fico contente de poder ter ajudado… E esse recurso que usei é completamente Documentado nos manuais Oracle correspondentes, reforço aqui a NECESSIDADE de os estudar bem….
[]s
Chiappa
OBS : e reforço também, novamente, que a opção de EXTERNAL TABLE permite usar toda a Riqueza de recursos da linguagem SQL Oracle numa carga, sempre é uma opção a se considerar quando/se viável….
2 de fevereiro de 2019 at 10:58 pm #115471gioracleParticipantEssa eu não conhecia. Muito bom @jlchiappa.
Obrigado por compartilhar conosco seu vasto conhecimento. 🙂 -
AuthorPosts
- You must be logged in to reply to this topic.