Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #94636
    elciodba
    Participante

      Pessoal,

      Preciso de uma função onde eu pego um caracter especial no registro e entre esse caracter eu quero
      enviar uma ação.

      por exemplo

      jose *silva* reis gostaria que quando estiver entre os ‘*’ ficasse maiusculo

      jose SILVA reis
      ou

      antonio maria *neves*
      antonio maria NEVES

      alguem conhece uma maneira ou alguma função que faça isso?

      obrigado

      Marcos

      #94637
      Marcos Braga
      Participante

        Cara…., gostei muito do desafio…

        na próxima mensagem vou postar uma doideira que fiz para conseguir o que precisa, acho que funcionou. Testa no seu ambiente e retorna para nós.

        Gostaria de saber a resposta.

        []s
        Braga

        #94638
        Marcos Braga
        Participante

          Vamos a batalha….

          Primeiro criei um ambiente para simular o que está passando:

          SQL> create table t1 (c1 varchar2(50));

          Tabela criada.

          SQL> insert into t1 values('marcos aurelio braga');

          1 linha criada.

          SQL> insert into t1 values('marcos aurelio braga');

          1 linha criada.

          SQL> insert into t1 values('marcos aurelio braga');

          1 linha criada.

          SQL> commit;

          Commit concluído.

          SQL> select * from t1;

          C1

          marcos aurelio braga
          marcos aurelio braga
          marcos aurelio braga

          Depois efetuei inúmeros testes, mas sempre esbarrava em como fazer somente o código que está entre os asteriscos ficarem maiúsculos…, pesquisa vai…, pesquisa vem…, achei uma idéia que foi útil para implementar o seguinte código:

          SQL> declare
          2 v1 varchar2(50);
          3 v2 varchar2(50);
          4 v3 varchar2(50);
          5 begin
          for i in (select c1 from t1) loop
          6 7 v1 := regexp_replace(i.c1, '(.)()(.)()(.)', '1');
          8 v2 := regexp_replace(i.c1, '(.
          )()(.)()(.)', '3');
          9 v2 := upper(v2);
          10 v3 := regexp_replace(i.c1, '(.)()(.)()(.*)', '5');
          11 dbms_output.put_line(v1||v2||v3);
          12 end loop;
          13 end;
          14 /
          MARCOS aurelio braga
          marcos AURELIO braga
          marcos aurelio BRAGA

          Procedimento PL/SQL concluído com sucesso.

          AHHHHHHH, acho que foi… tudo que está entre os asteriscos ficaram maiúsculos… kkkkkkkkkkkkkkkkkkkkk

          Nâo sei se é isso que precisa, mas poderá ter uma idéia.

          Não esquecendo que utilizei expressão regular, que funciona a partir da versão 10 do Oracle.

          []s
          Braga

          #94639
          Marcos Braga
          Participante

            Sei que deve ter algo mais simples utilizando o próprio REGEXP_REPLACE. Consegui algumas alternativas, mas teria que executar dois procedimentos.

            Caso essa solução não atenda, avisa que continuaremos na caça.

            []s
            Braga

            #94642
            fsitja
            Participante

              Fiz uma solução em SQL usando a cláusula model, porém com Regexp_Count, que só existe no Oracle 11g.


              Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
              Connected as FSITJA

              SQL> with tab as (
              2 select 'joao pereira dos santos' nome from dual union
              3 select 'jose silva reis' nome from dual union
              4 select 'jose silva reis farias' nome from dual union
              5 select '
              fatima* oliveira' nome from dual union
              6 select 'teresinha freitas almeida' nome from dual union
              7 select 'antonio maria neves' from dual)
              8 -- fim dos dados de exemplo, início do SQL
              9 --
              10 select n as nome, n2 as novo_nome
              11 from (select nome,
              12 row_number() over (order by 1) id,
              13 max(regexp_count(nome, '(([^]+)|([^]))')) over () max_cnt
              14 from tab)
              15 model dimension by (id as i)
              16 measures (cast(null as varchar2(4000)) as n2, cast(null as number) x, nome as n, max_cnt as mc, nome as p)
              17 rules update iterate (100) until iteration_number >= mc[1] - 1
              18 (
              19 x[any] = iteration_number,
              20 p[any] = regexp_substr(n[cv(i)], '(([^]+)|([^*]
              ))', 1, iteration_number + 1),
              21 n2[any] = n2[cv(i)] || case when regexp_like(p[cv(i)], '^
              .**$')
              22 then upper(rtrim(ltrim(p[cv(i)], ''), ''))
              23 else p[cv(i)] end
              24 );

              NOME NOVO_NOME


              fatima oliveira FATIMA oliveira
              teresinha freitas almeida TERESINHA freitas ALMEIDA
              antonio maria neves antonio maria NEVES
              joao pereira dos santos joao PEREIRA dos SANTOS
              jose silva reis jose SILVA reis
              jose silva reis *farias jose SILVA reis farias

              6 rows selected

              SQL>

              Acho que daria para fazer também sem o regexp_count para funcionar no 10g, mas tem que pensar um pouco mais numa gambiarra para simular a funcionalidade.

              #94658
              burga
              Participante

                Uma alternativa mais simples e mais limitada que funciona no 10g:

                select regexp_replace('antonio maria neves','(.)',
                UPPER(REPLACE(
                REGEXP_SUBSTR('antonio maria neves','*(.)
                '),'
                ')))
                from dual;

                Ela é limitada pois transformará em maiúsculo tudo que estiver entre o primeiro e o ultimo ‘*’ da sua string.
                Mas dá pra começar a brincar a partir daí.

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