Hola,
A ver si entiendo, tienes un string con varios vuelos o data y quieres sacar un valor o una cantidad de valores segun un separador ejm (;)
yo para esos casos utilizo esta funcion:
Código:
FUNCTION GetToken(stringvalues VARCHAR2,
indice NUMBER,
delim VARCHAR2
)
RETURN VARCHAR2
IS
start_pos NUMBER; -- Posición inicial de cada substring
end_pos NUMBER; -- Posición final de cada substring
BEGIN
-- Si el primer indice es uno
IF indice = 1 THEN
start_pos := 1; -- La posición inicial sera 1
ELSE
/* Se calcula la posición del delimitador segun el substring que se desea conseguir */
/* Ejm: 12;13; Se desea el inidice 2 del delim ; --> start_pos=3 */
start_pos := instr(stringvalues, delim, 1, indice - 1);
-- Si la posicion inicial es 0 se retorna null
IF start_pos = 0 THEN
RETURN NULL;
ELSE
-- Se calcula la posición inicial del substring sin importar el largo del delimitador
start_pos := start_pos + length(delim);
END IF;
END IF;
-- Se calcula la posición final del substring
end_pos := instr(stringvalues, delim, start_pos, 1);
IF end_pos = 0 THEN -- Se retorna el ultimo valor del arreglo
RETURN substr(stringvalues, start_pos);
ELSE -- Se retorna el valor del arreglo segun el inidice y delim indicado
RETURN substr(stringvalues, start_pos, end_pos - start_pos);
END IF;
END GetToken;
En ella pasas el delimitador ejm ; y el valor de coincidencia que quieres, por ejm el primero valor antes de un ;---> indice=1 delim=; stringvalues= string de caracteres.
Si son varios.... facil, cuenta la cantidad de delim que existen
Código:
SELECT length(stringvalues) - length(REPLACE(stringvalues,';'))
INTO count
FROM dual;
y luego llamas al gettoken tantos delim existan y vas incrementando con un contador, usando ese mismo contador vas guardando cada valor en tu variable de salida tipo tabla
Código:
salida(cont):=GetTokenGetToken('11;12;',cont,';');
recuerda declarar primero que nada el tipo tabla
Código:
TYPE tstring IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;
Para leer los valores con un simple loop tienes
Código:
FOR i IN 1 .. salida.LAST LOOP
-- Ves que haces con los resultados
END LOOP;
Saludos y suerte,