Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 22 do total)
  • Autor
    Posts
  • #87864
    Itimura
    Participante

      Olá!

      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-10x20UN

      Preciso construir um update que atualize a Descrição assim:
      Ajinomoto Carne 10x20UN

      Obs.: só entrou do campo embalagem o seguinte 10x20UN sem o inicio CX-

      O Campo embalagem é padronizado com essas informações
      NN-UUxIInn

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

      #87866
      Avatar photoRegis Araujo
      Participante

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

        #87867
        Avatar photoLeonardo Litz
        Participante

          Olá Itimura, segue exemplo

          update produtos
          set Descricao_produto= Descricao_produto|| substr(embalagem,4)

          Vlw Leonardo Litz

          #87869
          Ishii
          Participante

            Olá,

            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

            #87873
            Itimura
            Participante

              e ae feras!

              seguinte:

              registro de um select:


              SELECT DESCRICAO, EMBALAGEM FROM PCPRODUT

              DESCRICAO 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 PCPRODUT

              DESCRICAO
              IOIO MIX BRIGADEIRO DP 1X72G
              ARDOSIA MAX INCOLOR 1X750ML
              ARDOSIA MAX VERDE 12X750ML
              ARDOSIA MAX VERDE 6X750ML

              OBS.:
              VOU ELIMINAR A UNIDADE DE MEDIDA

              é possivel?!

              #87874
              Rodrigo Almeida
              Participante

                Olha 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-10x20UN
                

                10 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-10x20UN
                

                10 linhas selecionadas.

                SQL>

                Vai que vai…

                Abraços,
                Rodrigo Almeida

                #87875
                Ishii
                Participante

                  Olá,

                  Então vamos melhorar o REGEXP_REPLACE:


                  update PCPRODUT
                  set descricao = descricao || regexp_replace (embalagem, '[[:alpha:]]{2}-',' ');

                  Testa e nos avisa.

                  []s Ishii

                  #87876
                  Itimura
                  Participante

                    beleza, pode ser que funcione, preciso fazer uma alteração na estrutura do campo, ele só aceita 40 caracteres,

                    #87878
                    Itimura
                    Participante

                      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!

                      #87881
                      Itimura
                      Participante

                        Pergunto..

                        Como posso reverter o que eu fiz depois do commit?!

                        rsrsrs

                        😀

                        #87883
                        Avatar photoLeonardo Litz
                        Participante

                          Qual 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’ MINUTE

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

                          #87884
                          Avatar photoLeonardo Litz
                          Participante

                            Ah 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

                            #87885
                            Ishii
                            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

                              #87886
                              Itimura
                              Participante

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

                                #87887
                                Avatar photoLeonardo Litz
                                Participante

                                  Olá 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 dual

                                  ou 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 produtos

                                  em 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]

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