Ya había escrito de la necesidad de leer un archivo csv (comma separated values o valores separados por coma) en un post anterior que titule Procesar csv en oracle pero me tope con la necesidad de leer un archivo separado por “@” (arroba) en vez de “,” (comas).
Solo modifique un poco la función a la que se le manda la cadena a procesar, el valor que separa la cadena y la posición de la columna que deseas y te regresa su valor.
Si tienes por ejemplo la cadena:
11111@22222@33333@44444@55555
Necesitas sacar de esa cadena el 3er campo, o sea, el valor “33333″, solo generas la llamada a la función:
variable := get_string_value_best (3, ’@’, ’11111@22222@33333@44444@55555’);
Aquí les dejo la función:
--
-- GET_STRING_VALUE_BEST
--
-- return the string value for a string id "p_string_id"
-- separated by "p_string_var"
-- in a csv string "p_string"
--
CREATE OR REPLACE FUNCTION get_string_value_best (
p_string_id IN NUMBER,
p_string_var IN VARCHAR2,
p_string IN VARCHAR2)
RETURN VARCHAR2 IS
v_string_value VARCHAR2(2000);
BEGIN
IF (INSTR(p_string,p_string_var) > 0) AND
(p_string_id > 0) THEN
IF p_string_id = 1 THEN
v_string_value := SUBSTR(p_string, 0, INSTR(p_string,p_string_var,1,1)-1);
ELSE
IF (INSTR(p_string,p_string_var,1,p_string_id-1) > 0) AND
(INSTR(p_string,p_string_var,1,p_string_id) > 0) THEN
v_string_value := SUBSTR(p_string, INSTR(p_string,p_string_var,1,p_string_id-1)+1,
(INSTR(p_string,p_string_var,1,p_string_id)-1 -
INSTR(p_string,p_string_var,1,p_string_id-1)));
ELSIF
(INSTR(p_string,p_string_var,1,p_string_id-1) > 0) AND
(INSTR(p_string,p_string_var,1,p_string_id) = 0) THEN
v_string_value := SUBSTR(p_string, INSTR(p_string,p_string_var,1,p_string_id-1)+1,
(LENGTH(p_string) -
INSTR(p_string,p_string_var,1,p_string_id-1)));
END IF;
END IF;
END IF;
RETURN v_string_value;
END get_string_value_best;