2010-12-03 18 views
3

Je dois faire un programme qui utilisera fseek pour lire les données de la position pirticulaire. je dois lire les données ligne par ligne, et en ligne pirticular je dois utiliser fseek pour lire les données. Mais quand je suis en utilisant fseek et absolute_offset est de grande taille (petite taille du fichier moins de bits), il donne cette erreurUtl_file Fonction fseek donnant une erreur avec un décalage absolu important?

ORA-29284: file read error 
ORA-06512: at "SYS.UTL_FILE", line 219 
ORA-06512: at "SYS.UTL_FILE", line 1145 
ORA-06512: at line 15" 

mais avec une petite valeur comme absolute_offset 4000. fonctionne correctement et les données pioches. Ligne n ° 15 où j'utilise fseek donnant une erreur.

DECLARE 
    lv_utl UTL_FILE.FILE_TYPE; 
    v_buff VARCHAR2(2000); 
    l_exists boolean; 
    l_block VARCHAR2(2000); 
    l_file_length number; 
    v_line varchar2(5000); 
BEGIN 
    UTL_FILE.fgetattr('/d04/data/edi/inbound','POO0001.dat',l_exists,l_file_length,l_block); 
    lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R'); 
    --utl_file.get_line(lv_utl,v_line,50); 
    --dbms_output.put_line(v_line); 
    --l_file_length:=length(); 
    dbms_output.put_line(l_file_length); 
    utl_file.fseek(lv_utl,1261061); 
    utl_file.get_line(lv_utl,v_buff,100); 
    dbms_output.put_line(v_buff); 
    --lv_msg_txt := 'empno ename job manager hiredate commission salary department_no'; 
    --UTL_FILE.PUT_LINE(lv_utl,lv_msg_txt); 
    --UTL_FILE.PUT_LINE(lv_utl,'------------------------------------------------------------------------------------'); 
    --UTL_FILE.PUT_LINE(lv_utl,' '); 
    --UTL_FILE.FCLOSE(lv_utl); 
END; 
+0

Est-ce que file_length est retourné avec précision (c'est-à-dire avec une sortie "ls")? –

Répondre

1

Je l'ai exécuté dans mon environnement et j'ai également fait apparaître cette fenêtre. Bizarrement, si je spécifie une longueur de ligne maximale sur FOPEN cela semble fonctionner correctement.

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R'); 

ne fonctionne pas, mais

lv_utl := UTL_FILE.FOPEN('/d04/data/edi/inbound','POO0001.dat','R',5000); 

fonctionne parfaitement. Je n'ai aucune justification pour cela, mais ça ressemble à un bug. En guise de solution de rechange, vous pouvez essayer le package DBMS_LOB en utilisant BFILE s à la place.