2010-12-03 17 views
3

私はfseekを使用して、pirticular位置からデータを読み取るプログラムを作成する必要があります。 私は行ごとにデータを読み取る必要があり、pirticular行では、データを読み取るためにfseekを使用する必要があります。 しかし、私は、fseek関数とabsolute_offsetを使用しています(少し小さいファイルサイズ当時)大きいサイズであり、それはこのエラーにUtl_file fseek関数は大きな絶対オフセットでエラーを出しますか?

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" 

を与えるが、4000レンジのような小さなabsolute_offset値が適切とピックデータを働くと。 行番号15ここで、fseekがエラーを出しています。

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

file_lengthが正確に返されますか(つまり、 "ls"出力と一致しますか?) –

答えて

1

私はこれを私の環境で使いましたが、このポップアップもありました。奇妙なことに、FOPENに最大行数を指定すると、正しく動作するようです。完全

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

動作しません が、

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

作品。私はこれを正当化する必要はありませんが、確かにバグのように見えます。

回避策として、代わりにBFILEを使用してDBMS_LOBパッケージを試してみるとよいでしょう。

0

これまで私はこれに遭遇しました。あなたは()5000と上記第二の例ではそうしてきたように(FOPENへの呼び出しで指定されていない限り

最大ラインサイズは、1024

だから、Oracleが主張するだろう - 。それは行動を期待されている、というバグより。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

関連する問題