- Este tópico contém 21 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por
Itimura.
-
AutorPosts
-
14 de julho de 2009 às 10:37 pm #87864
Itimura
ParticipanteOlá!
mais uma vez conto com a ajuda de vocêis!
Existe uma tabela chamada Produtos…
Nessa tabela existem 2 campos que são do meu interesse
Descricao_produto e embalagem
Em Descrição eu tenho o nome do produto ex.: Ajinomoto Carne
e
Em Embalagem eu tenho ex.: CX-10x20UNPreciso construir um update que atualize a Descrição assim:
Ajinomoto Carne 10x20UNObs.: só entrou do campo embalagem o seguinte 10x20UN sem o inicio CX-
O Campo embalagem é padronizado com essas informações
NN-UUxIInnnão consigo construir nada parecido que faça isso…
e é uma linha de produtos muito grande, e não existe a possibilidade de fazer isso manualmente
Conto com vocêis!
Obrigado
Douglas Itimura
14 de julho de 2009 às 10:48 pm #87866Regis Araujo
ParticipanteFala Douglas..
Só para entender uma coisa.. vc precisa jogar na COLUNA C os valores da COLUNA A + B correto?
Tenta fazer assim…
update TB_DADOS set coluna C = A || B
Se tiver como. posta aqui alguns registros de ambas as colunas e como vc precisa que seja inserido que monto uma procedure que faz isto automaticamente..
Abraços…
14 de julho de 2009 às 10:50 pm #87867Leonardo Litz
ParticipanteOlá Itimura, segue exemplo
update produtos
set Descricao_produto= Descricao_produto|| substr(embalagem,4)Vlw Leonardo Litz
14 de julho de 2009 às 11:04 pm #87869Ishii
ParticipanteOlá,
Outra opção seria usar o regexp_replace:
update produtos
set descricao_produto = descricao_produto || regexp_replace (embalagem, 'CX-',' ');
Isso no caso de ser sempre ‘CX-‘ mas você pode aumentar isso para os outros casos que tenha.
[]s Ishii
14 de julho de 2009 às 11:12 pm #87873Itimura
Participantee ae feras!
seguinte:
registro de um select:
SELECT DESCRICAO, EMBALAGEM FROM PCPRODUTDESCRICAO EMBALAGEM
IOIO MIX BRIGADEIRO DP UN-1X72G
ARDOSIA MAX INCOLOR UN-1X750ML
ARDOSIA MAX VERDE CX-12X750ML
ARDOSIA MAX VERDE PC-6X750ML
O Update deve acrecentar de embalagem retirando a unidade de medida
DEVE FICAR ASSIM:
SELECT DESCRICAO FROM PCPRODUTDESCRICAO
IOIO MIX BRIGADEIRO DP 1X72G
ARDOSIA MAX INCOLOR 1X750ML
ARDOSIA MAX VERDE 12X750ML
ARDOSIA MAX VERDE 6X750MLOBS.:
VOU ELIMINAR A UNIDADE DE MEDIDA
é possivel?!
14 de julho de 2009 às 11:14 pm #87874Rodrigo Almeida
ParticipanteOlha essa “workarround” que fiz. hehehehe…
SQL> conn system@pel_dist_hom
Informe a senha:
Conectado.
SQL>
SQL>
SQL>
SQL>
SQL> create table PRODUTO (prodid number(5), descricao varchar2(255), embalagem varchar2(30));Tabela criada.
SQL> create sequence SEQ_PRODUTO start with 1 increment by 1 maxvalue 99999 nocache nocycle;
Seq³Ûncia criada.
SQL> declare
2 contador integer;
3 begin
4 contador := 1;
5 while contador col descricao format a30
SQL> select * from produto;PRODID DESCRICAO EMBALAGEM
1 AJINOMOTO CARNE CX-10x20UN 2 AJINOMOTO CARNE CX-10x20UN 3 AJINOMOTO CARNE CX-10x20UN 4 AJINOMOTO CARNE CX-10x20UN 5 AJINOMOTO CARNE CX-10x20UN 6 AJINOMOTO CARNE CX-10x20UN 7 AJINOMOTO CARNE CX-10x20UN 8 AJINOMOTO CARNE CX-10x20UN 9 AJINOMOTO CARNE CX-10x20UN 10 AJINOMOTO CARNE CX-10x20UN10 linhas selecionadas.
1 declare
2 cursor curPRODUTO is (select prodid, descricao, embalagem from produto);
3 type tpID is table of number;
4 type tpDESCRICAO is table of varchar2(255);
5 type tpEMBALAGEM is table of varchar2(60);
6 regID tpID;
7 regDESCRICAO tpDESCRICAO;
8 regEMBALAGEM tpEMBALAGEM;
9 begin
10 open curPRODUTO;
11 fetch curPRODUTO bulk collect into regID, regDESCRICAO, regEMBALAGEM;
12 close curPRODUTO;
13 if nvl(regID.COUNT,0) > 0 then
14 for counter in regID.FIRST..regID.LAST loop
15 update PRODUTO set descricao = CONCAT(descricao || ' ',SUBSTR(embalagem,4,66)) where prodid = counter;
16 end loop;
17 end if;
18* end;
SQL> /Procedimento PL/SQL concluÝdo com sucesso.
SQL> select * from PRODUTO;
PRODID DESCRICAO EMBALAGEM
1 AJINOMOTO CARNE 10x20UN CX-10x20UN 2 AJINOMOTO CARNE 10x20UN CX-10x20UN 3 AJINOMOTO CARNE 10x20UN CX-10x20UN 4 AJINOMOTO CARNE 10x20UN CX-10x20UN 5 AJINOMOTO CARNE 10x20UN CX-10x20UN 6 AJINOMOTO CARNE 10x20UN CX-10x20UN 7 AJINOMOTO CARNE 10x20UN CX-10x20UN 8 AJINOMOTO CARNE 10x20UN CX-10x20UN 9 AJINOMOTO CARNE 10x20UN CX-10x20UN 10 AJINOMOTO CARNE 10x20UN CX-10x20UN10 linhas selecionadas.
SQL>
Vai que vai…
Abraços,
Rodrigo Almeida14 de julho de 2009 às 11:31 pm #87875Ishii
ParticipanteOlá,
Então vamos melhorar o REGEXP_REPLACE:
update PCPRODUT
set descricao = descricao || regexp_replace (embalagem, '[[:alpha:]]{2}-',' ');
Testa e nos avisa.
[]s Ishii
14 de julho de 2009 às 11:36 pm #87876Itimura
Participantebeleza, pode ser que funcione, preciso fazer uma alteração na estrutura do campo, ele só aceita 40 caracteres,
14 de julho de 2009 às 11:58 pm #87878Itimura
ParticipanteValeu Ishii!
ficou assim
primeiro alterar a tabela para mais 10
ALTER TABLE PCPRODUT MODIFY DESCRICAO VARCHAR(50)
depois a linha de comando que você passou:
update PCPRODUT
set descricao = descricao || regexp_replace (embalagem, '[[:alpha:]]{2}-',' ')
só que eu queria entender esse regexp_replace
se conseguir me dizer agradecido des de jah!
15 de julho de 2009 às 1:28 am #87881Itimura
ParticipantePergunto..
Como posso reverter o que eu fiz depois do commit?!
rsrsrs
😀
15 de julho de 2009 às 2:58 am #87883Leonardo Litz
ParticipanteQual versao do teu banco de dados ai?
Se for 10g vc pode utilizar o flashback
Utilize a seguinte sintaxe:
SELECT * FROM PRODUTOS AS OF TIMESTAMP SYSTIMESTAMP – INTERVAL ‘180’ MINUTEMas para vc utilizar isso seu banco de dados deve esta com o flash back ativado e verifique o valor do parametro DB_FLASHBACK_RETENTION_TARGET, este parametro ira indicar qual o tempo que o banco de dados mantem os dados na area de flash back.
Vlw Leonardo Litz.
15 de julho de 2009 às 3:01 am #87884Leonardo Litz
ParticipanteAh ta, para vc retornar faca o seguinte
declare
FOR DD IN (SELECT A.* FROM (SELECT * FROM PRODUTOS AS OF TIMESTAMP SYSTIMESTAMP – INTERVAL ‘180’ MINUTE) A ) LOOP
INSERT INTO….. OU
UPDATE PRODUTOS
SET DESCRICAO = DD.DESCRICAO
WHERE PRIMARY_KEY = DD.PRIMARY_KEY;END LOOP;
END;
Vlw Leonardo Litz
15 de julho de 2009 às 5:40 am #87885Ishii
Participante[quote=”Itimura”:2w9j4jbh]Valeu Ishii!
ficou assim
primeiro alterar a tabela para mais 10
ALTER TABLE PCPRODUT MODIFY DESCRICAO VARCHAR(50)
depois a linha de comando que você passou:
update PCPRODUT
set descricao = descricao || regexp_replace (embalagem, '[[:alpha:]]{2}-',' ')
só que eu queria entender esse regexp_replace
se conseguir me dizer agradecido des de jah![/quote]
As expressões regulares são uma feature do Oracle 10g e podem ser usadas para melhorar as consultas SQL.
regexp_replace: substitui na coluna (embalagem) a expressão nesse caso inicial de dois caracteres alfanuméricos e o traço (comando [[:alpha:]]{2}-) se fossem numéricos seria então [[:digit:]] ou se fosse três caracteres seria então [[:alpha:]]{3}
Aqui nos fóruns e principalmente nos blogs tem um bom material para começar a entender e usar melhor essa feature.
[]s Ishii
15 de julho de 2009 às 2:37 pm #87886Itimura
ParticipanteNão consigo voltar mais,
Ishii
É possivel usar a mesma idéia do update para voltar o que era antes pois não estou conseguindo seguir o que nosso amigo explicou acima…
o Fato é que meu supervisor resolveu não querer mais esta alteração….
Obrigado
15 de julho de 2009 às 4:01 pm #87887Leonardo Litz
ParticipanteOlá Itimura, tente da seguinte forma
Exemplo
select 'Ajinomoto Carne 10x20UN','CX-10x20UN',substr('Ajinomoto Carne 10x20UN',1,instr('Ajinomoto Carne 10x20UN',substr('CX-10x20UN',4))-1)
from dualou seja, verifique se os registros estão da forma que vc deseja:
select descricao_produto,embalagem,substr(descricao_produto,1,instr(descricao_produto,substr(embalagem,4))-1)
from produtosem caso positivo atualize a descricao:
update produtos
set descricao_produto = substr(descricao_produto,1,instr(descricao_produto,substr(embalagem,4))-1)Obs: só irá funcionar se a codificação da embalagem não foi mudada.
Vlw Leonardo Litz[/code]
-
AutorPosts
- Você deve fazer login para responder a este tópico.