Pular para o conteúdo
  • Este tópico contém 12 respostas, 3 vozes e foi atualizado pela última vez 17 anos atrás por leo_carvalho.
Visualizando 13 posts - 1 até 13 (de 13 do total)
  • Autor
    Posts
  • #80774
    leo_carvalho
    Participante

      Alguem sabe como posso fazer para retirar as letras de uma string, somente utilizando as funções do Oracle, sem procedures, functions e afins criadas pelos DBA´s?

      Exemplo:

      As strings que a query retorna são ‘R85645TW’, ‘E421’, ‘399SS’ e tenho que tratar esses resultados para retornar somente os numerais como ‘85645’, ‘421’, ‘399’.

      #80775
      Ishii
      Participante

        Leo,

        Crie uma function para isso…

        Segue modelo:

        create or replace function func_remove_number
        (pString varchar2)

        return string is

        vNum number(4);
        vStringAux varchar2(2000);

        vTamanho number(4);

        begin

        vNum := 1;

        while vNum 0) then

        select length (vStringAux)
        into vTamanho
        from dual;

        end if;

        vNum := vNum + 1;

        end loop;

        return ( vStringAux );

        end func_remove_number;

        #80776
        Ishii
        Participante

          Leo,

          Acho que as funções Oracle diretas não iriam funcionar pois seria necessário analisar caracter a caracter..
          []s Ishii

          #80777
          Ishii
          Participante

            Leo,

            Achei um workaround (POG) para o seu caso;>)

            select rtrim(ltrim (‘R85645TW’,’ABCDEFGHIJKLMONPQRSTUVWYXZ’),’ABCDEFGHIJKLMONPQRSTUVWYXZ’) from dual;

            []s Ishii

            “Quem nunca usou um POG que atire a primeira pedra…”

            #80778
            leo_carvalho
            Participante

              Cara eu até tentei usar os conceitos de PO|G, mas deram pau na parada…ahauahauha….
              A função eu ate já tinha feito, parecida com a que voce me enviou, mas não queriam colocá-la em produção, ai usei o argumento, ou vai na gambiarra (usando POG) ou vai do jeito certo (com a função).
              Aí sim puseram a função em produção….

              Mas valew mesmo pela ajuda cara, obrigado...
              
              #80780
              leo_carvalho
              Participante

                A função que usei foi essa:

                CREATE OR REPLACE FUNCTION PROD.FN_RETIRA_NAO_NUMERICO( campoVerificado VARCHAR2 )
                RETURN VARCHAR2 IS

                   /*Declarando variáveis*/       
                   vTamanhoString         NUMBER;    
                   vPosInicio             NUMBER;   
                   vCaracter              NUMBER; 
                   vStringFinal           NUMBER;                     
                

                /Iniciando bloco de verificação/
                BEGIN

                        /*Inicializando variáveis*/
                        vPosInicio      := 0;   
                        vCaracter       := '';
                        vStringFinal    := '';
                        vTamanhoString  := LENGTH(campoVerificado);
                
                        /*Enquanto não chegar o fim da String*/
                        WHILE vPosInicio <= vTamanhoString
                              LOOP
                                  /*Verificando se o caracter é numérico ou não*/
                                  IF( UPPER(SUBSTR(campoVerificado, vPosInicio, 1) ) BETWEEN CHR(65) AND CHR(90))
                                      THEN
                                          /*Se verdadeiro, gravo vazio*/
                                          vCaracter := '';
                                      ELSE
                                          /*Se falso, gravo o caracter*/
                                          vCaracter := SUBSTR(campoVerificado, vPosInicio, 1);
                                  END IF;    
                
                                  /*Concatenando o resultado da verificação numa variável final*/
                                  vStringFinal := vStringFinal || vCaracter;
                                  /*Deslocando posições na String */
                                  vPosInicio   := vPosInicio + 1;
                
                              END LOOP;
                
                              /*Retornando a variável final*/
                              RETURN vStringFinal;
                
                              /*Tratando erros, retornando vazio*/
                              EXCEPTION
                                       WHEN others THEN
                                            DBMS_OUTPUT.PUT_LINE( ' Erro: ' || SQLERRM );
                                            RETURN '' ;
                

                END FN_RETIRA_NAO_NUMERICO;

                #80788
                santosclay
                Participante

                  Olá amigos!

                  Acredito que o comando TRANSLATE resolva o problema sem a necessidade de funções.

                  TRANSLATE(‘valor’, ‘caracteres a serem analisados’, ‘caracteres substitutos’);

                  Segue exemplo deste comando:

                  SELECT ‘R85645TW’ AS “VALOR”,
                  TRANSLATE(TRIM(‘R85645TW’),’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’, ‘0123456789’) AS “VALOR_COM_TRANLATE”
                  FROM DUAL;

                  Abraços Clayton.

                  #81042
                  leo_carvalho
                  Participante

                    Essa função que eu passei nesse tópico, não funciona com os exemplos:
                    ‘A00000SD’, ‘R02222AC’, ‘J00425PP’
                    Alguém sabe me dizer por que???

                    #81043
                    leo_carvalho
                    Participante

                      A função que tou usando tá aqui embaixo:

                      CREATE OR REPLACE FUNCTION PROD.FN_RETIRA_NAO_NUMERICO( campoVerificado VARCHAR2 )
                      RETURN VARCHAR2 IS

                         /*Declarando variáveis*/       
                         vTamanhoString         NUMBER;    
                         vPosInicio             NUMBER;   
                         vCaracter              NUMBER; 
                         vStringFinal           NUMBER;                     
                      

                      /Iniciando bloco de verificação/
                      BEGIN

                              /*Inicializando variáveis*/
                              vPosInicio      := 1;   
                              vCaracter       := '';
                              vStringFinal    := '';
                              vTamanhoString  := LENGTH(campoVerificado);
                      
                              /*Enquanto não chegar o fim da String*/
                              WHILE vPosInicio <= vTamanhoString
                                    LOOP
                                        /*Verificando se o caracter é numérico ou não*/
                                        IF( UPPER(SUBSTR(campoVerificado, vPosInicio, 1) ) BETWEEN CHR(48) AND CHR(57))
                                            THEN
                                                /*Se verdade, gravo o caracter*/
                                                vCaracter := SUBSTR(campoVerificado, vPosInicio, 1);
                      
                                            ELSE
                                                /*Se falso, gravo vazio*/
                                                vCaracter := '';
                      
                                        END IF;    
                      
                                        /*Concatenando o resultado da verificação numa variável final*/
                                        vStringFinal := vStringFinal || vCaracter;
                                        /*Deslocando posições na String */
                                        vPosInicio   := vPosInicio + 1;
                      
                                    END LOOP;
                      
                                    /*Retornando a variável final*/
                                    RETURN vStringFinal;
                      
                                    /*Tratando erros, retornando vazio*/
                                    EXCEPTION
                                             WHEN others THEN
                                                  DBMS_OUTPUT.PUT_LINE( ' Erro: ' || SQLERRM );
                                                  RETURN '' ;
                      

                      END FN_RETIRA_NAO_NUMERICO;

                      #81053
                      santosclay
                      Participante

                        Apena por curiosidade você utilizar o comando translate?

                        Abraços Clayton.

                        #81055
                        leo_carvalho
                        Participante

                          Eu utilizei a função “translate”, mas eu gostaria de saber se alguém percebe onde está o erro na função, pois eu não consegui indentificar, entende?

                          Se alguém puder ajudar, fico grato.

                          #81057
                          Ishii
                          Participante

                            Leo,

                            Na declaração da variável vStringFinal altere de NUMBER para VARCHAR2(2000)…

                            []s Ishii

                            #81069
                            leo_carvalho
                            Participante

                              Obrigado Ishii, a correção indicada por voce fez a função funcionar corretamente.

                              Obrigado mais uma vez.

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