Pular para o conteúdo
  • Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 5 anos, 4 meses atrás por Jean Ricardo de O Ferreira.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #109330
    fabio de queiroz
    Participante

      Bom dia,
      Tenho uma tabela de produtos onde preciso atualizar alguns campos que estão sem informação logístico de peso, o setor comercial me passou uma tabela no excel com os produtos e seus respectivos pesos bruto e liquido, gostaria de saber como fazer para alterar todos os registros em um único update.

      caso eu fosse alterar apenas um registro eu faria dessa forma:

      update cadastro set pesobruto =2, pesoliquido =1 where
      codigo=200
      and embalagem=’UN’

      #109332
      Motta
      Participante

        Não faz , você pode fazer um Bloco de Código PLSQL para ler esta tabela excel e atualizar sua base.

        Pelo excel creio ser possível gerar também um script (não sei como) que gere os comandos SQL.

        Qual seu grau de experiência em PLSQL ?

        #109337
        Avatar photoJosé Laurindo Chiappa
        Moderador

          vamos entender – vc tem uma planilha tipo :

          código embalagem pesobruto pesoliquido
          200 UN 2 1
          300 UN 4 5
          .... etc , muitas linhas mais ...

          E vc quer atualizar as linhas na tabela CADASTRO onde a coluna código e a coluna embalagem são as citadas na Planilha, certo ?? Se sim,vc tem MUITAS possibilidades pra isso :

          a) pra fazer num único UPDATE como vc diz que quer, a maneira mais simples é primeiro vc criar uma tabela extra no no banco Oracle, e DEPOIS carregar nela os dados que estão na Planilha (trocentas ferramentas pra se fazer isso existem, desde o oracle Loader até o Oracle SQL Developer, TOAD, PL/SQL developer, muitas mesmo)… Feito isso, vc terá PELO MENOS 3 sintaxes diferentes pra fazer o UPDATE na tal tabela CADASTRO que vc já tem com os dados que foram carregados na sua tabela extra, que nos exemplos abaxio chamarei de TAB_DADOS_ATUALIZAR, e vou supor que CODIGO é a coluna-chave na tabela CADASTROS :

          exemplo 1 , update correlacionado com query :

          UPDATE cadastro t1
          SET (codigo, embalagem, pesobruto, pesoliquido) = (SELECT t2.código, t2.embalagem, t2.pesobruto, t2.pesoliquido
          FROM TAB_DADOS_ATUALIZAR t2
          WHERE t1.CODIGO = t2.CODIGO);

          exemplo 2 , update em um JOIN (só funciona SE houver chave em ambas tabelas) :

          UPDATE (SELECT t1.embalagem embalagem1,
          t2.embalagem embalagem2,
          t1.pesobruto pesobruto1,
          t2.pesobruto pesobruto2,
          t1.pesoliquido pesoliquido1,
          t2.pesoliquido pesoliquido2,
          FROM CADASTRO t1,
          TAB_DADOS_ATUALIZAR t2
          WHERE t1.codigo = t2.codigo)
          SET embalagem1 = embalagem2,
          pesobruto1 = pesobruto2,
          pesoliquido1 = pesoliquido2;

          exemplo 3, MERGE :

          MERGE INTO CADSTRO t1 USING (SELECT * FROM TAB_DADOS_ATUALIZAR )t2
          ON(t1.id = t2.id)
          WHEN MATCHED THEN UPDATE SET
          t1.embalagem = t2.embalagem,
          t1.pesobruto = t2.pesobruto,
          t1.pesoliquido = t2.pesoliquido;

          OU

          b) como vc deve saber, embora o RDBMS Oracle não possa ler dados diretamente de uma planilha Excel nativamente, é SIM possível vc programar uma package que abra o arquivo Excel e extraia os dados via SELECT : vide https://technology.amis.nl/2013/01/19/read-a-excel-xlsx-with-plsql/ para exemplo, já usei várias vezes com MUITO sucesso esta package do Anton Scheffer…

          OU

          c) gere os UPDATEs necessários na própria planilha, um pra cada linha : uma maneira é ARRASTAR a coluna do código pro fim da planilha, crie na planilha uma nova coluna inicial contendo nas células dessa coluna uma string fixa ‘UPDATE CADASTRO SET’, insira uma coluna com a string ‘SET embalagem=’ antes da coluna com o valor da embalagem, uma coluna com a string PESOLIQUIDO= antes da coluna com o pesoloquido, assim por diante, até o final onde deve estar o WHERE que vc adicionará…
          Ou seja, a idéia é passar na planilha disto :

          código embalagem pesobruto pesoliquido
          200 UN 2 1
          300 UN 4 5

          pra isto :


          colnova embalagem colnova pesobruto , colnova pesoliquido colnova código colnova
          UPDATE CADASTRO SET embalagem= UN pesobruto= 2 , pesoliquido= 1 where CODIGO= 200 ;
          UPDATE CADASTRO SET embalagem= UN pesobruto= 4 , pesoliquido= 5 where CODIGO= 300 ;

          Aí fica trivial : salva como um texto, carrega ele num BOM editor de texto de programador (notepad++ é meu preferido), faça os mínimos ajustes necessários e execute num programa cliente Oracle qquer, sqlplus que seja…..

          []s

          Chiappa

          #109338
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Evidentemente, há uma 4a opção que é conectar no database Oracle a partir da planilha Excel e escrever um programinha VBA que mande os UPDATEs necessários pro banco : https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:243814703172 exemplifica uma query mas pode se mandar qualquer SQL pro database programando em VBA dentro de um Excel….
            Eu não a citei porque é razoavelmente complexo pra quem não manja tanto assim de VBA e de OLEDB dentro do Excel, mas fica a dica/indicação, para o caso de que vc disponha de expertise in-house nessas coisas…

            []s

            Chiappa

            #109339
            fabio de queiroz
            Participante

              Muito obrigado jlchiappa, com certeza vou conseguir com uma dessas opções, a que eu fizer posto aqui depois o resultado.

              #109340
              Avatar photoJosé Laurindo Chiappa
              Moderador

                Blz, fico contente de poder ter ajudado…. Só uma obs : se vc sentir que vai começar a receber frequentemente dados dos seus usuários em planilha Excel (não é a ferramenta mais própria pra isso, mas enfim), analise com carinho a possibilidade de criação de uma package PL/SQL dentro do banco que permite fazer SELECT direto nos dados da Planilha – como eu disse, eu passei por uma situação do tipo um tempo atrás e resolvi investir um tempinho na criação de uma solução do tipo, e não me arrependi nem um pouco, é notável a flexibilidade e conveniência que vc ganha em data cleaning, merge, ordenação e pesquisa se puder usar a linguagem SQL e as funcionalidades built-in do RDBMS Oracle….
                Claro, isso se vc julgar que vale o esforço por causa de ser uma tarefa repetitiva : se vc achar que nunca mais vai precisar de nada assim, use uma das outras opções ….

                []s

                Chiappa

                #143480
                Jean Ricardo de O Ferreira
                Participante

                  Uma possível solução para esse update poderia ser:

                  update TABELA A set
                  ( A.CAMPO_1
                  , A.CAMPO_2
                  , A.CAMPO_3
                  , A.CAMPO_4
                  , A.CAMPO_5
                  , A.CAMPO_6 ) = ( select B.CAMPO_1
                  , B.CAMPO_2
                  , B.CAMPO_3
                  , B.CAMPO_4
                  , B.CAMPO_5
                  , B.CAMPO_6
                  from TABELA B
                  where B.CAMPO_CONDICAO_1 = <VARIAVEL_1>
                  AND B.CAMPO_CONDICAO_2 = <VARIAVEL_2>
                  and B.CAMPO_CONDICAO_3 = <VARIAVEL_3>
                  and B.CAMPO_CONDICAO_4 = <VARIAVEL_4>
                  and B.CAMPO_CONDICAO_5 = to_date(<VARIAVEL_5>, ‘dd/mm/yyyy’)

                  and A.CAMPO_CHAVE_1 = B.CAMPO_CHAVE_1
                  and A.CAMPO_CHAVE_2 = B.CAMPO_CHAVE_2
                  and A.CAMPO_CHAVE_3 = B.CAMPO_CHAVE_3
                  and A.CAMPO_CHAVE_4 = B.CAMPO_CHAVE_4
                  and A.CAMPO_CHAVE_5 = B.CAMPO_CHAVE_5
                  and A.CAMPO_CHAVE_6 = B.CAMPO_CHAVE_6
                  and A.CAMPO_CHAVE_7 = B.CAMPO_CHAVE_7
                  and A.CAMPO_CHAVE_8 = B.CAMPO_CHAVE_8
                  and A.CAMPO_CHAVE_9 = B.CAMPO_CHAVE_9
                  )
                  where A.CAMPO_CONDICAO_1 = <VARIAVEL_1>
                  AND A.CAMPO_CONDICAO_2 = <VARIAVEL_2>
                  and A.CAMPO_CONDICAO_3 = <VARIAVEL_3>
                  and A.CAMPO_CONDICAO_4 = <VARIAVEL_4>
                  and A.CAMPO_CONDICAO_5 = to_date(<VARIAVEL_5>, ‘dd/mm/yyyy’)
                  AND A.CAMPO_CONDICAO_6 is null

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress