sql >> Base de Datos >  >> RDS >> Oracle

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

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

La forma más antigua es configurar el parámetro INIT.ORA UTL_FILE_DIR. Tenemos que reiniciar la base de datos para que un cambio surta efecto. Al valor le puede gustar 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');

El UTL_FILE_DIR está en desuso porque 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 se pueden otorgar discretamente a usuarios individuales. Además, con los objetos de directorio podemos agregar, eliminar o cambiar directorios sin rebotar la base de datos.

En cualquier caso, el oracle El usuario del sistema operativo 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 usar ningún enfoque para exponer un directorio en nuestra PC local a un proceso que se ejecuta en un servidor de base de datos remoto. Los archivos deben cargarse en el servidor de la base de datos o en una unidad de red compartida.

Si el oracle El usuario del sistema operativo 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.