Hola que tal,
Yo cree esta funcion para eso
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 cuentas la cantidad de delim que existen
Código:
SELECT length(stringvalues) - length(REPLACE(stringvalues,';'))
INTO count
FROM dual;
Y puedes guardar cada valor en una variable
Código:
salida:=GetToken('11;12;',count,';');
donde count seria el numero de valor(1 primer,2 segundo)
Igualemente la menciono en este otro post
http://www.forosdelweb.com/f100/func...record-783668/
Con esta función puedes empezar a jugar y probar para el resultado que necesitas.
Saludos.