Pular para o conteúdo
  • Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 8 anos, 3 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #108101
    Avatar de airoospairoosp
    Participante

      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

      #108352
      Avatar de Fábio PradoFábio Prado
      Participante

        Airoosp,

        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

        #108353
        Avatar photoJosé Laurindo Chiappa
        Moderador

          +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,'[][.@:%/?!{}#$|¿_~^;,*&+-=*“()\””]’)
          ——————————————————————
          1

          SQL>

          ===> 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
          ——————————–
          123

          SQL> select DECODE(replace(translate(:NR_OS,’1234567890′,’##########’),’#’),NULL,
          ‘So tem Digitos’,
          ‘POSSUI caracteres alfa’
          ) as TESTE from dual;

          TESTE
          ———————-
          So tem Digitos

          SQL> exec :NR_OS :=’123-A’;

          PL/SQL procedure successfully completed.

          SQL> print NR_OS

          NR_OS
          ——————————–
          123-A

          SQL> select DECODE(replace(translate(:NR_OS,’1234567890′,’##########’),’#’),NULL,
          ‘So tem Digitos’,
          ‘POSSUI caracteres alfa’
          ) as TESTE from dual;

          TESTE
          ———————-
          POSSUI caracteres alfa

          SQL>

          ==> 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 ?

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