Pular para o conteúdo
Viewing 8 posts - 1 through 8 (of 8 total)
  • Author
    Posts
  • #114545
    Avatar de sergiomsosergiomso
    Participant

      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 …………..

      #114689
      Avatar photoJosé Laurindo Chiappa
      Moderator

        Blz ? 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

        #115115
        Avatar de sergiomsosergiomso
        Participant

          CHIAPPA,

          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.

          #115116
          Avatar photoJosé Laurindo Chiappa
          Moderator

            Nã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

            #115134
            Avatar photoJosé Laurindo Chiappa
            Moderator

              Pra 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,Technology

              C:\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 Technology

              scott@DESENV:SQL>

              okdoc ??

              []s

              Chiappa

              #115265
              Avatar de sergiomsosergiomso
              Participant

                CHIAPPA,

                Sensacional.

                Muito obrigado pelo apoio, me ajudou bastante. Eu testei aqui e funcionou usando esta condição.

                Obrigado.

                #115297
                Avatar photoJosé Laurindo Chiappa
                Moderator

                  Blz, 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….

                  #115471
                  giovano avatargioracle
                  Participant

                    Essa eu não conhecia. Muito bom @jlchiappa.
                    Obrigado por compartilhar conosco seu vasto conhecimento. 🙂

                  Viewing 8 posts - 1 through 8 (of 8 total)
                  • You must be logged in to reply to this topic.
                  plugins premium WordPress