válida utl_file ruta ora invalid generar example ejemplo directorio desde archivo acceso oracle plsql oracle9i utl-file

oracle - ora - ¿El procedimiento UTL_FILE.FOPEN() no acepta la ruta para el directorio?



utl_file.fopen invalid directory path (6)

Intento escribir en un archivo almacenado en c: / unidad llamada vin1.txt y obtener este error. ¡Sugiero!

> ERROR at line 1: ORA-29280: invalid > directory path ORA-06512: at > "SYS.UTL_FILE", line 18 ORA-06512: at > "SYS.UTL_FILE", line 424 ORA-06512: at > "SCOTT.SAL_STATUS", line 12 ORA-06512: > at line 1

AQUÍ está el código

create or replace procedure sal_status ( p_file_dir IN varchar2, p_filename IN varchar2) IS v_filehandle utl_file.file_type; cursor emp Is select * from employees order by department_id; v_dep_no departments.department_id%TYPE; begin v_filehandle :=utl_file.fopen(p_file_dir,p_filename,''w'');--Opening a file utl_file.putf(v_filehandle,''SALARY REPORT :GENERATED ON %s/n'',SYSDATE); utl_file.new_line(v_filehandle); for v_emp_rec IN emp LOOP v_dep_no :=v_emp_rec.department_id; utl_file.putf(v_filehandle,''employee %s earns:s/n'',v_emp_rec.last_name,v_emp_rec.salary); end loop; utl_file.put_line(v_filehandle,''***END OF REPORT***''); UTL_FILE.fclose(v_filehandle); end sal_status; execute sal_status(''C:/',''vin1.txt'');--Executing


Necesita que su DBA modifique el archivo init.ora y agregue el directorio al que desea acceder al parámetro ''utl_file_dir''. La instancia de la base de datos deberá detenerse y reiniciarse porque init.ora solo se lee cuando se abre la base de datos.

Puede ver (pero no cambiar) este parámetro ejecutando la siguiente consulta:

SELECT * FROM V$PARAMETER WHERE NAME = ''utl_file_dir''

Comparte y Disfruta.


Necesita registrar el directorio con Oracle. fopen toma el nombre de un objeto de directorio, no la ruta. Por ejemplo:

(Es posible que deba iniciar sesión como SYS para ejecutar estos)

CREATE DIRECTORY MY_DIR AS ''C:/'; GRANT READ ON DIRECTORY MY_DIR TO SCOTT;

Luego, puede consultarlo en la llamada para abrir:

execute sal_status(''MY_DIR'',''vin1.txt'');


No olvide también que la ruta del archivo está en la máquina del servidor oracle real y no en cualquier máquina de desarrollo local que pueda estar llamando a su procedimiento almacenado. Esto es probablemente muy obvio, pero algo que debe recordarse.


Para utl_file.open (ubicación, nombre de archivo, modo), debemos indicar el nombre del directorio para la ubicación pero no la ruta. Por ejemplo: DATA_FILE_DIR, este es el nombre del directorio y verifica la ruta del directorio para ese nombre de directorio en particular.


El nombre del directorio parece ser sensible a mayúsculas y minúsculas. Me enfrenté al mismo problema, pero cuando proporcioné el nombre del directorio en mayúscula funcionó.


Desde Oracle 9i hay dos formas o declarar un directorio para usar con UTL_FILE.

La forma más antigua es establecer el parámetro INIT.ORA UTL_FILE_DIR. Tenemos que reiniciar la base de datos para que un cambio surta efecto. El valor puede gustarle a cualquier otra variable PATH; acepta comodines. Usar este enfoque significa pasar la ruta del directorio ...

UTL_FILE.FOPEN(''c:/temp'', ''vineet.txt'', ''W'');

El enfoque alternativo es declarar un objeto de directorio.

create or replace directory temp_dir as ''C:/temp'' / grant read, write on directory temp_dir to vineet /

Los objetos de directorio requieren la ruta de archivo exacta y no aceptan comodines. En este enfoque, pasamos el nombre del objeto de directorio ...

UTL_FILE.FOPEN(''TEMP_DIR'', ''vineet.txt'', ''W'');

UTL_FILE_DIR está en desuso debido a que es intrínsecamente inseguro: todos los usuarios tienen acceso a todos los directorios del sistema operativo especificados en la ruta, mientras que los privilegios de lectura y escritura pueden otorgarse discretamente a usuarios individuales. Además, con los objetos de Directorio, podemos agregar, eliminar o cambiar directorios sin tener que rebotar en la base de datos.

En cualquier caso, el usuario de oracle OS debe tener privilegios de lectura y / o escritura en el directorio del sistema operativo . En caso de que no sea obvio, esto significa que el directorio debe ser visible desde el servidor de la base de datos . Por lo tanto, no podemos utilizar ninguno de los enfoques para exponer un directorio en nuestra PC local a un proceso que se ejecuta en un servidor de base de datos remota. Los archivos deben cargarse en el servidor de la base de datos o en una unidad de red compartida.

Si el usuario de oracle OS no tiene los privilegios apropiados en el directorio del sistema operativo, o si la ruta especificada en la base de datos no coincide con una ruta real, el programa lanzará esta excepción:

ORA-29283: invalid file operation ORA-06512: at "SYS.UTL_FILE", line 536 ORA-29283: invalid file operation ORA-06512: at line 7

El texto de OERR para este error es bastante claro:

29283 - "invalid file operation" *Cause: An attempt was made to read from a file or directory that does not exist, or file or directory access was denied by the operating system. *Action: Verify file and directory access privileges on the file system, and if reading, verify that the file exists.