- Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 8 anos, 3 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
31 de março de 2016 às 12:26 am #108101airoospParticipante
Boa tarde,
Criei em uma trigger de insert a consistência abaixo:
Declare
v_caracter varchar2(1);
NR_OS varchar2(10);
NR_OS:=:new.ordemservico;
.
.
.
if regexp_instr(NR_OS ,'[][.@:%/?!{}#$|¨_~^<>;,*&+-=*“()\””]’) > 0 then
v_caracter:=’S’;
else
v_caracter:=’N’;
end if;
.
.
.O objetivo é verificar se a informação que o campo ORDEMSERVICO esta recebendo contém algum caracter especial. O mais estranho é que mesmo recebendo apenas números, o IF retorna true e consequentemente carrega S na variável v_caracter.
Há alguma coisa errada na linha de comando do regexp_instr ?
Se alguém tiver alguma dica e/ou informação agradeço.
Obrigado.
Airton
15 de agosto de 2016 às 5:02 am #108352Fábio PradoParticipanteAiroosp,
Expressões regulares são complexas e eu não tive tempo de parar e testar essa sua. Sugiro que vc veja nas referências do artigo http://www.fabioprado.net/2010/10/expressoes-regulares.html ajuda para construir suas expressões regulares.
[]s
15 de agosto de 2016 às 5:46 pm #108353José Laurindo ChiappaModerador+1 aqui apontando o mesmo : Inclusive, dada a Muito Maior Complexidade de expressões REGEXP, em meu caso particular eu só as uso ** EM ÚLTIMO CASO **, quando Realmente, Absolutamente, NECESSARIAMENTE preciso delas…
No seu caso específico, o teste mais simples indica que *** REALMENTE ** a sua expressão NÃO ESTÁ CORRETA, tem algum dos caracteres de formatação que tá contando dígitos numéricos :SQL> variable NR_OS varchar2(10);
SQL> exec :NR_OS := ‘123’;PL/SQL procedure successfully completed.
SQL> print NR_OS
NR_OS
——————————–
123=> vou exibir o resultado da sua chamada tregexp, que copiei & colei :
SQL> select regexp_instr(:NR_OS ,'[][.@:%/?!{}#$|¿_~^;,*&+-=*“()\””]’) from dual;
REGEXP_INSTR(:NR_OS,'[][.@:%/?!{}#$|¿_~^;,*&+-=*“()\””]’)
——————————————————————
1SQL>
===> Tá vendo que ela *** Não ESTÁ RETORNANDO ZERO *** quando vc só tem dígitos numéricos na string ??? Corrija aí se vc que por qualquer motivo usar REGEXP, mas EU, pessoalmente, prefiro usar as built-ins de string, mesmo : na sua necessidade, que (ao que entendi) é saber se tem qualquer caracter a mais afora dígitos numéricos, eu (entre as N possibilidades via built-ins primitivas) escolheria a TRANSLATE, que TROCA ou REMOVE caracteres de acordo com a lista que vc informar, tipo :
SQL> print NR_OS
NR_OS
——————————–
123SQL> select DECODE(replace(translate(:NR_OS,’1234567890′,’##########’),’#’),NULL,
‘So tem Digitos’,
‘POSSUI caracteres alfa’
) as TESTE from dual;TESTE
———————-
So tem DigitosSQL> exec :NR_OS :=’123-A’;
PL/SQL procedure successfully completed.
SQL> print NR_OS
NR_OS
——————————–
123-ASQL> select DECODE(replace(translate(:NR_OS,’1234567890′,’##########’),’#’),NULL,
‘So tem Digitos’,
‘POSSUI caracteres alfa’
) as TESTE from dual;TESTE
———————-
POSSUI caracteres alfaSQL>
==> Eu pessoalmente acho *** MUITO *** mais Fácil de entender esta última versão, Sabendo-se o que faz o TRANSLATE, que é Trocar ou Eliminar Caracteres…
[]s
Chiappa
OBS : é ululantemente Óbvio : se é só isso que vc quer, NÂO HÁ NECESSIDADE NENHUMA de se criar uma trigger pra isso – se não for possível por qquer motivo o CORRETO, que é um campo NUMBER ser definido como NUMBER, vc pode ter um CHECK CONSTRAINT, ** evitando ** assim o eventual overhead de performance associado à triggers, ok ?
-
AutorPosts
- Você deve fazer login para responder a este tópico.