Pular para o conteúdo
  • Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 15 anos atrás por burga.
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #93579
    Anônimo

      Bom dia a todos, estou aprendendo Oracle e preciso de ajuda para resolver um problema que estou penando há um tempo já. Tenho uma tabela NF e nela criei um campo Num_NF (varchar2) neste campo possuo algumas notas armazenadas com espaços a esquerda e direita e zeros a esquerda. Gostaria de obter um exemplo de uso do comando TRIM ou LTRIM no qual delete tanto os zeros a esquerda quanto os espaçamentos. Podem me ajudar? Se possível gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?

      #93581
      fsitja
      Participante

        Segue abaixo:

        SQL> select ltrim(ltrim(rtrim(' 000999.11 ')), '0') from dual;

        LTRIM(LTRIM(RTRIM('000999.11')

        999.11

        SQL>

        [quote=”faabade”:1b6vws65]gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?[/quote]
        Não entendi… você pode postar o código que você está rodando e que está causando isso. Trim não deleta registros.

        A menos que você esteja falando do médodo Trim usado em nested tables. Mesmo assim ele só elimina os registros previamente deletados (vazios).

        #93582
        Anônimo

          [quote=”fsitja”:po5mhw2z]Segue abaixo:

          SQL> select ltrim(ltrim(rtrim(' 000999.11 ')), '0') from dual;

          LTRIM(LTRIM(RTRIM('000999.11')

          999.11

          SQL>

          [quote=”faabade”:po5mhw2z]gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?[/quote]
          Não entendi… você pode postar o código que você está rodando e que está causando isso. Trim não deleta registros.

          A menos que você esteja falando do médodo Trim usado em nested tables. Mesmo assim ele só elimina os registros previamente deletados (vazios).[/quote]

          Obrigado pelo retorno fsitja, eu rodei o script que passou e aconteceu exatamente o que descreveu mas eu fiz um select na minha tabela e o dado desta não foi alterado segue:

          select ltrim(ltrim(rtrim(‘ 3 ‘)), ‘0’) from NF;
          1 3
          2 3
          3 3
          4 3
          5 3

          select Num_NF from nf:

          1 1
          2 2
          3 003
          4 004
          5 00000005

          Com o primeiro comando os espaços e zeros as esquerda da linha 3 não deveriam ser deletados?

          #93583
          burga
          Participante

            Na verdade, quando você utiliza o select com “trims”, os dados são alterados somente para a apresentação.

            Se você quer alterar permanentemente a informação contida no campo Num_NF da tabela NF, você deverá efetuar o update dos dados.

            update NF set Num_NF = ltrim(ltrim(rtrim(Num_NF)), '0');

            #93584
            Anônimo

              [quote=”burga”:2565ak5h]Na verdade, quando você utiliza o select com “trims”, os dados são alterados somente para a apresentação.

              Se você quer alterar permanentemente a informação contida no campo Num_NF da tabela NF, você deverá efetuar o update dos dados.

              update NF set Num_NF = ltrim(ltrim(rtrim(Num_NF)), '0'); [/quote]

              Era isso mesmo, eu só esqueci de uma condição, há campos que podem conter letras, neste caso eu precisarei converter o campo (TO_NUMBER) antes de usar o comando TRIM ou há um outro jeito?

              #93586
              burga
              Participante

                Se um valor contém letras você não conseguirá converter em número, o Oracle retornará a seguinte mensagem de erro:

                select to_number(‘as’) from dual;

                Erro ao iniciar na linha 1 no comando
                select to_number(‘as’) from dual
                Relatório de erro:
                Erro de SQL: ORA-01722: número inválido
                01722. 00000 – “invalid number”
                *Cause:
                *Action:

                Na condição do update você pode filtrar pra ele não converter valores com letras.

                WHERE REGEXP_LIKE(TRIM(Num_NF),’^[[:digit:]]+$’);

                #93587
                fsitja
                Participante

                  Na verdade esse tipo de teste é muito difícil de ser feito com expressões regulares. Isso porque um número pode conter vírgulas e pontos, sendo válido para conversão, e isso ainda depende de configuração de NLS_NUMERIC_CHARS.

                  O mais fácil de testar a possibilidade de conversão é criar uma function que converta ou capture o erro em caso de exception.

                  Depois eu posto um exemplo, agora tá na minha hora. 😉

                  #93590
                  burga
                  Participante

                    Opa, realmente tem o problema dos pontos e vírgulas, mas sendo números de endereços, acho que dá pra ignorar que vão existir números quebrados e retirar todos os pontos e virgulas da string.

                    WHERE REGEXP_LIKE(REPLACE(REPLACE(TRIM(Num_NF),’,’),’.’),’^[[:digit:]]+$’);

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