Pular para o conteúdo
  • Este tópico contém 3 respostas, 4 vozes e foi atualizado pela última vez 18 anos, 1 mês atrás por Fontalva.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #76273
    cgiorgi
    Participante

      E ae blz,

      To precisando fazer o seguinte tenho uma coluna na tabela com varios valores separados por | tipo ‘3|12|4|5|7|2’ sendo que os numeros variam de um a dois caracteres no maximo, tenho que imprimir eles separadamente .

      Alguem sabe de alguma forma de fazer isso em pl ?

      Abraço

      Carlo

      #77668
      Anônimo

        VÊ se te ajuda brother:

        DECLARE
        v_retorna_texto owa_util.vc_arr;
        v_string VARCHAR2(25) :=’1|33|2|158|13|8|9′;

        FUNCTION fun_ret_array(v_texto VARCHAR2, v_separador VARCHAR2)
        RETURN OWA_UTIL.vc_arr
        IS
        cnt NUMBER := 1;
        pos NUMBER := 1;
        acum VARCHAR2 (4000) := v_texto;
        arr_retorno OWA_UTIL.vc_arr;
        BEGIN
        IF v_texto IS NULL OR v_separador IS NULL
        THEN
        RETURN arr_retorno;
        END IF;

         WHILE pos  0
         LOOP
            pos := INSTR (acum, v_separador);
        
            IF pos = 0
            THEN
               arr_retorno (cnt) := acum;
            ELSE
               arr_retorno (cnt) := SUBSTR (acum, 1, pos - 1);
               acum := SUBSTR (acum, pos + LENGTH (v_separador));
               cnt := cnt + 1;
            END IF;
         END LOOP;
        
         RETURN arr_retorno;
        

        END fun_ret_array;
        BEGIN
        v_retorna_texto := fun_ret_array (v_string,’|’);
        FOR x IN 1..v_retorna_texto.COUNT
        LOOP
        dbms_output.put_line(‘Texto Separado: ‘ || v_retorna_texto(x));
        END LOOP;
        END;

        Abraços,

        Trevisolli.

        #77676
        chduarte
        Participante

          Assim tb funciona. Dois caminhos para as pedras!

          declare
          v_char varchar2(32676) := ‘3|12|4|5|7|2356|436′;
          begin
          while (instr(v_char,’|’) != 0) loop
          dbms_output.put_line(substr(v_char,1,instr(v_char,’|’)-1));
          v_char := substr(v_char,instr(v_char,’|’)+1,length(v_char));
          end loop;
          dbms_output.put_line(v_char);
          end;
          /

          Grande []

          Carlos Henrique Duarte
          DBA Oracle 11i

          #77888
          Fontalva
          Participante

            Só mais um exemplo.

            Declare
            v_string Varchar2(23) := '|1|2||3|9|74|05|234|11'; --> Variavel String que será Destribuida
            v_retorno Varchar2(10); --> Variavel que recebera os campos da String
            Begin
            v_string := v_string||'|'; --> Atribuo o pipe '|' no final para que não reste nenhum campo no final da String
            for x in 1..length(v_string) Loop --> Loop que correra a String inteira.
            If substr(v_string,x,1) '|' Then --> Se for um pipe '|' sei que acabou um campo
            v_retorno := v_retorno||substr(v_string,x,1); --> V_retorno recebe ele mesmo concatenado com o proximo caracter atual
            Else
            If x > 1 Then --> Caso seja o primeiro ainda seja o primeiro campo o pipe '|' não faço nada.
            dbms_output.put_line(v_retorno);
            End If;
            v_retorno := '';
            End If;
            End Loop;
            End;

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