Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

FUNCTION split

Estas en el tema de FUNCTION split en el foro de Oracle en Foros del Web. Hola, tengo una tabla con correos separados por ";" y necesito hacer un registro con cada uno de los correos. Por ahi me encontre una ...
  #1 (permalink)  
Antiguo 05/07/2012, 15:13
 
Fecha de Ingreso: octubre-2004
Ubicación: Santiago de Chile
Mensajes: 504
Antigüedad: 19 años, 6 meses
Puntos: 0
Información FUNCTION split

Hola, tengo una tabla con correos separados por ";" y necesito hacer un registro con cada uno de los correos. Por ahi me encontre una funcion que me permite separar por algun caracter.

Código:
create or replace type split_tbl as table of varchar2(32767);
Código:
CREATE OR REPLACE FUNCTION split(p_list varchar2,p_del varchar2 := ';') RETURN split_tbl pipelined IS
  l_idx pls_integer;
  l_list varchar2(32767) := p_list;
  --l_value  varchar2(32767);
BEGIN
  loop
    l_idx := instr(l_list,p_del);
    IF l_idx > 0 THEN
      pipe ROW(substr(l_list,1,l_idx-1));
      l_list := substr(l_list,l_idx+LENGTH(p_del));
    ELSE
      pipe ROW(l_list);
      exit;
    END IF;
  END loop;
RETURN;
END split;
luego puedo hacer:

Código:
select * from table(split('uno;dos;tres'));
esto necesito implementarlo para un cursor algo asi:

Código:
declare 
  email1 ppl_origen.email%type;
  TYPE correos IS TABLE OF varchar2(32767);
  posicion_inicio number := 0;
  l_text char := ';';
  cadena varchar2(50);
  cursor busca is
  select email, rowid FROM ppl_origen where email like '%;%' and rownum <= 2;
begin
  FOR busca_1 IN busca LOOP
    posicion_inicio := INSTR(busca_1.email, l_text);     
    if (posicion_inicio>0) then
      select column_value into correos from table(split(busca_1.email));
      FOR i IN correos.FIRST..correos.LAST
      LOOP
         dbms_output.put_line(correos(i));
      END LOOP;    
    end if;
  end loop;    
end;
pero todo mal no logro controlar la columna column_value. Eso muchas gracias
__________________
Dios es mas grande que tu problema :-)
  #2 (permalink)  
Antiguo 06/07/2012, 00:51
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: FUNCTION split

No he conseguido hacer funcionar ese codigo que pones, pero si lo que quieres es una funcion que de un string te saque todos los email que hay que están separados por punto y coma, yo tengo una funcioncilla que lo hace, solo tienes que adaptarla a tus necesidades.
Es muy arcaica, pero funciona de maravilla-


DECLARE

V_IN_STR NUMBER;
V_CADENA1 VARCHAR2(4000);
V_CADENA2 VARCHAR2(4000);

BEGIN

v_cadena1 := '[email protected];[email protected];[email protected] s;[email protected];[email protected]' ;

LOOP
V_IN_STR := INSTR(V_CADENA1,';');

IF v_IN_STR = 0 THEN
dbms_output.put_line(v_cadena1);
EXIT;
END IF;

V_CADENA2 := LTRIM(RTRIM(SUBSTR(v_CADENA1,1,V_IN_STR-1)));

dbms_output.put_line(v_cadena2);

v_CADENA1 := LTRIM(RTRIM(SUBSTR(v_CADENA1,V_IN_STR+1)));
END LOOP;

END;
  #3 (permalink)  
Antiguo 06/07/2012, 08:54
 
Fecha de Ingreso: octubre-2004
Ubicación: Santiago de Chile
Mensajes: 504
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: FUNCTION split

me funciona re bien!!
estou muy agradecido.

Saludos!
Mauricio
__________________
Dios es mas grande que tu problema :-)

Etiquetas: funcion, function, select, split, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:24.