Esta está facilita, me tope con la necesitad de procesar un archivo csv (comma separated values o valores separados por coma) con utl_file no tuve mayor problema para leer el archivo, ¿pero la cadena (o registro) del archivo, como la leo? Fácil, cree una función a la que se le manda la cadena a procesar 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 3 campo, o sea, el valor “33333″, solo generas la llamada a la función:
variable := get_string_value (3, ’11111,22222,33333,44444,55555’);
Aquí les dejo la función:
--
-- GET_STRING_VALUE
--
-- return the string value for a string id "p_string_id"
-- in a csv string "p_string"
--
function get_string_value (
p_string_id in number,
p_string in varchar2)
return varchar2 is
v_string_value varchar2(200);
begin
if (instr(p_string,',') > 0) and
(p_string_id > 0) then
if p_string_id = 1 then
v_string_value := substr(p_string, 0, instr(p_string,',',1,1)-1);
else
if (instr(p_string,',',1,p_string_id-1) > 0) and
(instr(p_string,',',1,p_string_id) > 0) then
v_string_value := substr(p_string, instr(p_string,',',1,p_string_id-1)+1,
(instr(p_string,',',1,p_string_id)-1 -
instr(p_string,',',1,p_string_id-1)));
elsif
(instr(p_string,',',1,p_string_id-1) > 0) and
(instr(p_string,',',1,p_string_id) = 0) then
v_string_value := substr(p_string, instr(p_string,',',1,p_string_id-1)+1,
(length(p_string) -
instr(p_string,',',1,p_string_id-1)));
end if;
end if;
end if;
return v_string_value;
end get_string_value;
Por supuesto no es la única forma de procesar una cadena con valores separados por coma, acá tengo otra forma mediante un loop:
declare
v_line varchar2(1000);
v_value varchar2(100);
v_index number;
begin
v_line := '11111,22222,33333,44444,55555';
v_index := 0;
for i in 1.. length(v_line) loop
if (substr(v_line, i, 1) = ',') or
(length(v_line) = i ) then
--aqui lo que deseas hacer para cada valor
--v_value tendra el valor del campo
v_value := replace(substr(v_line, v_index+1, (i-v_index)), ',','');
v_index := i;
end if;
end loop;
end;