Oracle/PL/SQL/UTL FILE
Apariencia
Para leer o escribir archivos es necesario crear un objeto directory desde SQL:
create directory dir_tmp as 'c:\temp'; grant read, write on directory dir_tmp to usuario;
Escritura
[editar]create or replace procedure escribir is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen ('DIR_TMP', 'test_utl_file.txt', 'w');
utl_file.put_line (v_archivo, 'Prueba de escritura');
utl_file.put (v_archivo, 'Texto sin fin de línea');
utl_file.put_line (v_archivo, ' que sigue y termina acá.');
utl_file.fclose(v_archivo);
end;
/
Lectura
[editar]create or replace procedure leer is
v_archivo utl_file.file_type;
v_linea varchar2(1024);
begin
v_archivo := utl_file.fopen ('DIR_TMP', 'test_utl_file.txt', 'r');
loop
utl_file.get_line (v_archivo, v_linea);
dbms_output.put_line (v_linea);
end loop;
--utl_file.fclose(v_archivo);
exception
when no_data_found then
--Debemos cerrar, el archivo aqui ya que en el momento que no encuentre lineas salta directamente a la la execpción y no lo cerraría.
utl_file.fclose(v_archivo);
dbms_output.put_line ('Fin del archivo');
end;
/
Manejo de Errores
[editar]Si otro proceso tiene abierto y bloqueado el archivo:
create or replace procedure abrir_bloqueado is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen ('DIR_TMP', 'test_utl_file.txt', 'w');
utl_file.fclose(v_archivo);
dbms_output.put_line ('Ok');
exception
when utl_file.invalid_operation then
dbms_output.put_line ('Error: utl_file.invalid_operation');
end;
/
Si no hay permisos de lectura:
create or replace procedure abrir_no_lectura is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen ('DIR_TMP', 'test_utl_file.txt', 'r');
utl_file.fclose(v_archivo);
dbms_output.put_line ('Ok');
exception
when utl_file.access_denied then
dbms_output.put_line ('Error: utl_file.access_denied');
end;
/
Si el archivo no existe:
create or replace procedure abrir_no_existe is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen ('DIR_TMP', 'test_no_existe.txt', 'r');
utl_file.fclose(v_archivo);
dbms_output.put_line ('Ok');
exception
when utl_file.invalid_operation then
dbms_output.put_line ('Error: utl_file.invalid_operation');
end;
/