Update em vários registros com dados diferentes

Home Fóruns SQL e PL/SQL Update em vários registros com dados diferentes

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

    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

    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

    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

    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.
Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detectado !

Verificamos que está usando alguma extensão para bloquear os anúncios. O GPO (Grupo de Profissionais Oracle) obtém a sua renda através dos anúncios, para assim manter toda a estrutura dedicada a universalização do conhecimento.

Se você gosta de nosso trabalho, pedimos por gentileza que desabilite o ads blocker. Trabalhamos somente com o Google Adsense e tentamos ao máximo exibir apenas o necessário.

Agradecemos de antemão ! :)

Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock