Buscar uma palavra entre ponto e virgula

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Bom dia pessoal,

Eu tenho uma coluna em uma tabela que armazena o seguinte dado:

TESTE;TESTE_DOIS;TESTE_TRES;TESTE_QUATRO

Eu preciso pegar somente as palavras.

alguém pode me ajudar?


Obrigado!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Pelo o que entendi você deseja pegar os valores de "campos" segmentados, no seu caso separados por ponto e vírgula.

Segue uma função não-recursiva que poderá ser utilizada para obter dados segmentados, como num CSV ou num flexfield chave do EBS.

Selecionar tudo

CREATE OR REPLACE FUNCTION get_segment_f(text      IN VARCHAR2
                                        ,segmento  IN NUMBER
                                        ,separator IN CHAR DEFAULT ';') RETURN VARCHAR2 AS

  pos     NUMBER := 0;
  pos_ini NUMBER := 0;
  pos_fim NUMBER := 0;

BEGIN
  /* excecuta o loop até encontrar a posição desejada */
  WHILE pos < segmento
  LOOP
    
    IF (pos_ini = instr(text, separator, -1)) THEN
      pos_fim := length(text) + 1;
    ELSE
      pos_fim := instr(text, separator, pos_ini + 1);
    END IF;

    pos := pos + 1;
    IF (pos <> segmento) THEN
      pos_ini := pos_fim;
    END IF;
    /* Sai do programa quando estourar o limite do texto */
    IF (pos_ini > length(text)) THEN
      EXIT;
    END IF;
  END LOOP;
  RETURN(substr(text, pos_ini + 1, (pos_fim - pos_ini - 1)));

END;
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

é assim:

Eu preciso pegar a primeira palavra e armazenar em uma variavel, depois ir atras da outra palavra e concatenar com a primeira que eu peguei e assim vai até não existir mais palavra.
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Fiz assim e funcionou:

Selecionar tudo

SET SERVEROUTPUT ON
declare

    v_inicio  number;
    v_pos     number;
    v_result  varchar2(1000);
    v_string  varchar2(1000;

begin

   v_pos    := 1;
   v_inicio := 1;

   select col_nm 
   into   v_string 
   from teste 
   where tbl_nm = 'table_nm';
   
   loop  
   exit when v_pos >= length(v_string);

     if substr(v_string, v_pos, 1) = ';' then    
        v_result := v_result ||' t1.'||substr(v_string, v_inicio, (v_pos) - v_inicio)||' = t2.'||substr(v_string, v_inicio, (v_pos) - v_inicio)||' and';    
        v_inicio := v_pos + 1;
     end if;
     v_pos := v_pos + 1;

   end loop;
      v_result := v_result ||' t1.'||substr(v_string, v_inicio)||' = t2.'||substr(v_string, v_inicio);
      dbms_output.put_line(v_result);
end;
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Oi cleberz,

Entendi que você quer remover os separadores armazenados nesta coluna, que vamos chamar de COLUNA_TESTE.

Ou seja, "TESTE;TESTE_1;TESTE_2" passaria a ser ""TESTETESTE_1TESTE_2".

Se for este o caso, bastaria usar a função REPLACE do ORACLE:

REPLACE (COLUNA_TESTE, ';' ,'')

Desconfio que não precisaria usar uma função para concatenar os valores dentro da coluna.

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes