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

      Pessoal,

      tenho uma dúvida no meu UPDATE

      Vou atualizar o nome do municipio de cada cliente,
      tenho 2 tabelas,
      Clientes(PCCLIENT), Cidade(PCCIDADE)
      nas duas eu tenho o código IBGE o que facilita esta atualização como referência,
      então o Update para ajustar o nome ficaria assim:

      UPDATE PCCLIENT SET
      PCCLIENT.MUNICCOB = PCCIDADE.NOMECIDADE,
      PCCLIENT.MUNICENT = PCCIDADE.NOMECIDADE,
      PCCLIENT.MUNICCOM = PCCIDADE.NOMECIDADE
      WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE

      Porém tenho uma dificuldade com programação em PL/SQL
      E as observações a serem feitas são:

      Nem todos os clientes possuem Codigo IBGE
      As colunas da tabela de clientes (PCCLIENT) MUNICOB, MUNICENT E MUNICOM é do tipo Varchar2(15),
      e o nome da cidade na tabela de Cidades(PCCIDADE) é do tipo Varchar2(80), isso quer dizer que:
      eu só posso atualizar o nome da cidade até 15 caracteres

      Preciso de ajuda para complementar meu UPDATE, alguem poderia me ajuda??

      Grato a todos que leram

      Douglas Itimura

      #100738
      Itimura
      Participante

        por favor, me ajudem

        #100739
        leandrolbs
        Participante

          Itimura, seguinte não entendi qual o seu problema… mas um substr(nome_cid_80,1,15) retornará os 15 primeiros caracteres…. sendo assim o c” x(15) = substr(y(80),1,15) funcionará.

          acho que é isso…rsss caso não seja, explique melhor.

          #100740
          leandrolbs
          Participante

            UPDATE PCCLIENT SET
            PCCLIENT.MUNICCOB = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
            PCCLIENT.MUNICENT = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
            PCCLIENT.MUNICCOM = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
            WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE

            #100742
            lordmaca
            Participante

              [quote=”leandrolbs”:34mk4n06]

              UPDATE PCCLIENT SET
              PCCLIENT.MUNICCOB = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
              PCCLIENT.MUNICENT = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
              PCCLIENT.MUNICCOM = (select substr(nomecidade,1,15) from PCCIDADE WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE )
              WHERE PCCLIENT.CODCIDADE = PCCIDADE.CODCIDADE

              [/quote]

              Isso tem que ser feito com bloco pl/sql pois esses selects vao retornar mais de um valor.

              Estou sem nenhuma anotacao de plsql aqui, assim que conseguir posto.

              abraco.

              #100745
              leandrolbs
              Participante

                lordmarca, nao estou muito bom hoje…rsss (segundona braba) mas é código IBGE, a tabela cidade só pode retornar uma linha….

                o update tem quer melhorado, mas o substr acho ser o maior problema do colega…

                #100748
                rman
                Participante

                  @Itimura


                  MERGE INTO PCCLIENT CLIENT
                  USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
                  WHEN MATCHED THEN
                  UPDATE SET CLIENT.MUNICICCOB = SUBSTR(CIDADE.NOMECIDADE,1,15)


                  MERGE INTO PCCLIENT CLIENT
                  USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
                  WHEN MATCHED THEN
                  UPDATE SET CLIENT.MUNICENT = SUBSTR(CIDADE.NOMECIDADE,1,15)


                  MERGE INTO PCCLIENT CLIENT
                  USING PCCIDADE CIDADE ON CIDADE.COD_CIDADE = CLIENT.CODCIDADE
                  WHEN MATCHED THEN
                  UPDATE SET CLIENT.MUNICCOM = SUBSTR(CIDADE.NOMECIDADE,1,15)

                  Merge é um comando DML, logo não existe ROLLBACK desta transação, não teste isso em uma base de produção.

                  Segue um artigo como referencia:

                  http://miltonbastos.com/2011/07/29/merge/

                  #100751
                  burga
                  Participante

                    Na verdade existe rollback sim, por ser um comando DML. Mas o RMAN já deu a deixa do caminho legal pra resolver teu problema.

                    Outra opção, se não quiser atualizar cidades com mais do que 15 caracteres no nome é usar a a função LENGTH no nome com condição <= 15.

                    #100752
                    leandrolbs
                    Participante

                      No updatinho basico tbm funciona….


                      create table PCCLIENT (
                      cnpj varchar2(15),
                      municob varchar2(15),
                      municent varchar2(15),
                      municcom varchar2(15),
                      codcidade varchar2(5));
                      --==================================
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('1', 'ASDDDA', 'SDFSFASDFD', 'fgj', '12');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('2', 'SFSAF', 'ASFASDF', 'ghj', '13');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('3', 'ASFDASF', 'SDFASDF', 'j', '14');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('4', 'SDFSADF', 'ASDFSADF', 'rturth', '15');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('5', 'ASDFASDF', 'ASDFASF', 'wethweth', '16');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('6', 'ASDF', 'ASDF', 'ehewhe', '17');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('7', 'ASDF', 'ASDF', 'qerhehq', '18');
                      insert into PCCLIENT (cnpj, municob, municent, municcom, codcidade)
                      values ('8', 'ASDF', 'SDF', '8erherhq', '19');
                      --=====================================
                      create table PCCIDADE (
                      codcidade varchar2(5),
                      nomecidade varchar2(80));

                      --=====================================
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('12', 'SANTO ANTONIO DE POSSE');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('13', 'SANDOVALINA');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('14', 'SANTA ALBERTINA');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('15', 'SANTO ANTONIO DO PARANAPANEMA');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('16', 'SANTA AYG DA CONCEICAO');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('17', 'SANTA DRC DA ESPERANCA');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('18', 'SANTA CVG DA ESTRELA');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('19', 'SANTA BGHG DO RIO PARDO');
                      insert into PCCIDADE (codcidade, nomecidade)
                      values ('20', 'SANTA OUJYY DOS LOPES');
                      --=====================================
                      select * from pcclient pcli
                      where exists (
                      select * from pccidade pcid
                      where pcli.codcidade = pcid.codcidade
                      ); -- Ok
                      --=====================================
                      update PCCLIENT pcli
                      set (pcli.MUNICOB, pcli.MUNICENT, MUNICCOM) =
                      (select substr(nomecidade, 1, 15),substr(nomecidade, 1, 15),substr(nomecidade, 1, 15)
                      from PCCIDADE pcid
                      WHERE pcli.CODCIDADE = pcid.CODCIDADE);
                      --=====================================
                      select * from pcclient pcli --Ok
                      1 1 SANTO ANTONIO D SANTO ANTONIO D SANTO ANTONIO D 12
                      2 2 SANDOVALINA SANDOVALINA SANDOVALINA 13
                      3 3 SANTA ALBERTINA SANTA ALBERTINA SANTA ALBERTINA 14
                      4 4 SANTO ANTONIO D SANTO ANTONIO D SANTO ANTONIO D 15
                      5 5 SANTA AYG DA CO SANTA AYG DA CO SANTA AYG DA CO 16
                      6 6 SANTA DRC DA ES SANTA DRC DA ES SANTA DRC DA ES 17
                      7 7 SANTA CVG DA ES SANTA CVG DA ES SANTA CVG DA ES 18
                      8 8 SANTA BGHG DO R SANTA BGHG DO R SANTA BGHG DO R 19

                      #100753
                      leandrolbs
                      Participante

                        No sript acima, seria somente esta a parte principal..
                        o resto é teste…


                        update PCCLIENT pcli
                        set (pcli.MUNICOB, pcli.MUNICENT, MUNICCOM) =
                        (select substr(nomecidade, 1, 15),substr(nomecidade, 1, 15),substr(nomecidade, 1, 15)
                        from PCCIDADE pcid
                        WHERE pcli.CODCIDADE = pcid.CODCIDADE);

                        #100754
                        rman
                        Participante

                          [quote=”burga”:22ouk99a]Na verdade existe rollback sim, por ser um comando DML. Mas o RMAN já deu a deixa do caminho legal pra resolver teu problema.

                          Outra opção, se não quiser atualizar cidades com mais do que 15 caracteres no nome é usar a a função LENGTH no nome com condição <= 15.[/quote]

                          Verdade, existe ROLLBACK mesmo, eu que me confudi.

                          DDL que não tem ROLLBACK, DML sim.

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