Estamos obteniendo el siguiente error en SQL un procedimiento en Ubuntu. El mismo procedimiento se ejecuta correctamente en Windows. El objetivo del procedimiento es la importación de un .csv archivo en externa de una tabla de oracle.

El error de Oracle:

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

Este ASÍ que la pregunta podría haber sido una solución, pero incluso después de dar los permisos adecuados chmod 777 (que resolvió el problema en ese caso) a los archivos en cuestión al que nos enfrentamos el mismo error.

ORA-29283: archivo no válido operación ORA-06512: en «SYS.UTL_FILE», de la línea de 536

La preocupación de parte de el procedimiento es el siguiente:

for i in c loop   
dbms_output.put_line('Inside for loop');
select count(file_name) into f_n from t_filenames_exp e where i.file_name=e.file_name;
if f_n=0 then
dbms_output.put_line('Inside if statement');
insert into t_filenames_exp(file_name,status) values(i.file_name,'need_to_read');
select f_id into f_idn from t_filenames_exp e where e.file_name=i.file_name;
select substr(i.file_name,instr(i.file_name,'exp_'),4) into fchk from dual;
select to_char(to_date(to_char(SEQ_DATE,'dd-MON-yyyy'),'dd-MON-yyyy'),'D') into v_sufix from M_LAB_ID_SEQ_TAB;
if(fchk='exp_') then
file_handle := UTL_FILE.FOPEN('EXP_DATA',i.file_name,'R');
file_handle1 := UTL_FILE.FOPEN('EXP','staging.txt','W');
loop
begin
utl_file.get_line(file_handle,output_line);
utl_file.put_line(file_handle1,output_line);  
exception when no_data_found then
exit;
end;  
end loop;
if utl_file.is_open(file_handle) then
utl_file.fclose(file_handle);
end if;
if utl_file.is_open(file_handle1) then
utl_file.fclose(file_handle1);
end if;  
/*insert into  t_files_data_exp(f_id,patient_last_name,patient_name,patient_id_code,method_internal_index,method_acronym,index_repeat,result,unit_of_measurement,minimum_reference_value,maximum_reference_value,date_)
select f_idn,patient_last_name,patient_name,(patient_id_code ||'H'||v_sufix),method_internal_index,method_acronym,index_repeat,result,  unit_of_measurement,minimum_reference_value,maximum_reference_value,date_ from files_data;*/
insert into  t_files_data_exp(f_id,patient_last_name,patient_name,patient_id_code,method_internal_index,method_acronym,index_repeat,result,unit_of_measurement,minimum_reference_value,maximum_reference_value,date_)
select f_idn,'Unknown','Unknown',(r.patient_id_code ||'H'||v_sufix),m.CANONICAL_ID,r.METHOD_ACRONYM,0,r.RESULT,r.unit_of_measurement,'','','' from files_data r ,M_METHODS_EXP m where m.METHOD_ACRONYM=r.METHOD_ACRONYM;
else  
file_handle := UTL_FILE.FOPEN('EXP_DATA',i.file_name,'R');
file_handle1 := UTL_FILE.FOPEN('EXP','staging1.txt','W');
loop
begin
utl_file.get_line(file_handle,output_line);
utl_file.put_line(file_handle1,output_line);
exception when no_data_found then
exit;
end;  
end loop;
if utl_file.is_open(file_handle) then
utl_file.fclose(file_handle);
end if;
if utl_file.is_open(file_handle1) then
utl_file.fclose(file_handle1);
end if;
insert into  t_files_data_exp(f_id,patient_last_name,patient_name,patient_id_code,method_internal_index,method_acronym,index_repeat,result,unit_of_measurement,minimum_reference_value,maximum_reference_value,date_)  
select f_idn,'Unknown','Unknown',r.PATIENT_ID_CODE,m.CANONICAL_ID,r.METHOD_ACRONYM,0,r.RESULT,r.unit_of_measurement,'','','' from rfiles_data r ,M_METHODS_EXP m where m.METHOD_ACRONYM=r.METHOD_ACRONYM;                 
end if;          
-- Check whether the data in csv file is same as data in external table.         
if trace='on' then
if(fchk='expr_')  then    
dbms_output.put_line('**************************************************');
select i.file_name,count(*) into filename,rows_in_file from files_data;
dbms_output.put_line('File name :'||filename);
dbms_output.put_line('Total no of rows :'||rows_in_file);
select replace(filename,'exp','_exp')  into new_filename from dual;       
file_handle2 := UTL_FILE.FOPEN('EXP_LOG',new_filename,'W');
for i1 in cur loop                      
/*data:=to_char (i1.patient_last_name||';'||i1.patient_name||';'||i1.patient_id_code||';'||i1.method_internal_index||';'||i1.method_acronym||';'||i1.index_repeat||';'||i1.result||';'||i1.unit_of_measurement||';'||i1.minimum_reference_value||';'||i1.maximum_reference_value||';'||i1.date_);*/
data:=to_char(i1.patient_id_code||';'||i1.method_acronym||';'||i1.result||';'||i1.unit_of_measurement);
utl_file.put_line(file_handle2,data);
end loop;  
else
dbms_output.put_line('**************************************************');
select i.file_name,count(*) into filename,rows_in_file from rfiles_data;
dbms_output.put_line('File name :'||filename);
dbms_output.put_line('Total no of rows :'||rows_in_file);
select replace(filename,'expr','_expr')  into new_filename from dual;         
file_handle2 := UTL_FILE.FOPEN('EXP_LOG',new_filename,'W');     
for i1 in cur1 loop                      
/*data:=to_char (i1.m_id||';'||i1.date_||';'||i1.METHOD_ACRONYM||';'||i1.PATIENT_ID_CODE||';'||i1.TEST_TYPE||';'||i1.UNIT_OF_MEASUREMENT||';'||i1.RESULT||';'||i1.RESULT_FLAG); */
data:=to_char(i1.patient_id_code||';'||i1.method_acronym||';'||i1.result||';'||i1.unit_of_measurement);
utl_file.put_line(file_handle2,data);
end loop;  
end if;
if utl_file.is_open(file_handle2) then
utl_file.fclose(file_handle2);
end if;         
dbms_output.put_line('*************************************************');
end if;
end if;   
end loop; 

La línea en la que está produciendo el error es:

file_handle := UTL_FILE.FOPEN('EXP_DATA',i.file_name,'R');

Los permisos que se otorgan para el archivo es el siguiente:

-rwxrwxrwx 1 rama rama 240 Feb 26 11:24 exp_41_02_2016.csv

Cómo trazar el problema que está causando este problema? Por favor, hágamelo saber si usted desea cualquier otra información?

  • ¿Has probado a buscar en el archivo manualmente en una concha mientras está conectado como Oracle? No sólo los permisos de archivo que usted necesita para comprobar, el Oráculo de la cuenta tiene que ser capaz de ver el directorio demasiado. Si no es dueño de toda la ruta del directorio que EXP_DATA puntos para luego tendrías que cada directorio chmod g+rx o o+rx dependiendo de qué grupo es el dueño y si Oracle pertenece a ese grupo. Estoy suponiendo que el archivo (y el directorio, por supuesto) está en la base de datos del servidor, no una máquina cliente.
  • Sí, he iniciado la sesión como oracle por sudo su - oracle y puede ver el archivo de shell. El propietario del directorio padre también ha sido cambiado a oracle por chown -R oracle ~/exp . Ahora el permiso es : drwxrwxrwx 7 oracle srl 4096 Feb 27 09:18 exp . En realidad estamos ejecutando como localhost (para el propósito de la prueba), el archivo está en la unidad de disco duro local. Hay alguna forma de comprobar el escenario dentro del código? Pls vamos a saber si usted necesita saber nada más.
  • No estoy seguro de lo que quieres decir acerca de localhost y a la unidad de disco duro local – es el directorio en la misma máquina en la base de datos se encuentra en?
  • Sí, es a lo que me refería. No sé precisamente lo que ha hecho este, después de hacer el chown y chmod, se reinicia el sistema y se comenzó a trabajar. Gracias! Debe haber sido un problema de permisos, pero no podía encontrarlo antes. Por favor enviar su comentario como respuesta, así que puede marcar como correcta.
InformationsquelleAutor Br. Sayan | 2016-02-26

1 Comentario

  1. 0

    Es un o/s de archivo de error…probablemente de permisos. El propietario de la base de datos de la sombra proceso que está ejecutando el paquete es el o/s propietario tiene permisos — que probablemente ‘oracle’. Usted puede hacerse la prueba de sesión como ‘oracle’ en el servidor de base de datos y ver si usted puede leer el archivo en cuestión. @alex poole ofrece una gran reflexión para comprobar los permisos de todos los directorios padre.

Dejar respuesta

Please enter your comment!
Please enter your name here