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.