- 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.
-
AutorPosts
-
12 de julho de 2018 às 4:35 pm #109330fabio de queirozParticipante
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’12 de julho de 2018 às 5:21 pm #109332MottaParticipanteNã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 ?
12 de julho de 2018 às 7:46 pm #109337José Laurindo ChiappaModeradorvamos 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
12 de julho de 2018 às 8:25 pm #109338José Laurindo ChiappaModeradorEvidentemente, 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
12 de julho de 2018 às 11:02 pm #109339fabio de queirozParticipanteMuito obrigado jlchiappa, com certeza vou conseguir com uma dessas opções, a que eu fizer posto aqui depois o resultado.
12 de julho de 2018 às 11:45 pm #109340José Laurindo ChiappaModeradorBlz, 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
23 de julho de 2019 às 5:15 pm #143480Jean Ricardo de O FerreiraParticipanteUma 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 -
AutorPosts
- Você deve fazer login para responder a este tópico.