- Este tópico contém 12 respostas, 3 vozes e foi atualizado pela última vez 17 anos atrás por leo_carvalho.
-
AutorPosts
-
13 de novembro de 2007 às 4:50 pm #80774leo_carvalhoParticipante
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’.
13 de novembro de 2007 às 5:13 pm #80775IshiiParticipanteLeo,
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;13 de novembro de 2007 às 5:16 pm #80776IshiiParticipanteLeo,
Acho que as funções Oracle diretas não iriam funcionar pois seria necessário analisar caracter a caracter..
[]s Ishii13 de novembro de 2007 às 5:25 pm #80777IshiiParticipanteLeo,
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…”
13 de novembro de 2007 às 5:55 pm #80778leo_carvalhoParticipanteCara 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...
13 de novembro de 2007 às 6:22 pm #80780leo_carvalhoParticipanteA 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;
16 de novembro de 2007 às 6:39 pm #80788santosclayParticipanteOlá 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.
8 de janeiro de 2008 às 3:25 pm #81042leo_carvalhoParticipanteEssa função que eu passei nesse tópico, não funciona com os exemplos:
‘A00000SD’, ‘R02222AC’, ‘J00425PP’
Alguém sabe me dizer por que???8 de janeiro de 2008 às 3:27 pm #81043leo_carvalhoParticipanteA 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;
9 de janeiro de 2008 às 5:30 pm #81053santosclayParticipanteApena por curiosidade você utilizar o comando translate?
Abraços Clayton.
9 de janeiro de 2008 às 6:40 pm #81055leo_carvalhoParticipanteEu 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.
9 de janeiro de 2008 às 6:52 pm #81057IshiiParticipanteLeo,
Na declaração da variável vStringFinal altere de NUMBER para VARCHAR2(2000)…
[]s Ishii
10 de janeiro de 2008 às 3:11 pm #81069leo_carvalhoParticipanteObrigado Ishii, a correção indicada por voce fez a função funcionar corretamente.
Obrigado mais uma vez.
-
AutorPosts
- Você deve fazer login para responder a este tópico.